如何编写一个采用可选input参数的bash脚本?
我希望我的脚本能够selectinput,
例如目前我的脚本是
#!/bin/bash somecommand foo
但我想说的是:
#!/bin/bash somecommand [ if $1 exists, $1, else, foo ]
您可以使用默认值语法:
somecommand ${1:-foo}
以上将会按照Bash参考手册 – 3.5.3 Shell参数扩展 [我的重点]中所述:
如果参数未设置或为空 ,则replace单词的扩展名。 否则,参数的值被replace。
如果您只想在参数未设置的情况下replace默认值(但不是如果为空,例如不是如果它是空string),请使用以下语法:
somecommand ${1-foo}
再次从Bash参考手册 – 3.5.3shell参数扩展 :
省略冒号只会导致未设置参数的testing。 换句话说,如果包含冒号,运算符会testing两个参数的存在,并且它的值不为空; 如果省略冒号,操作员只testing存在。
你可以像这样设置一个variables的默认值:
somecommand.sh
ARG1=${1:-foo} ARG2=${2:-bar} echo $ARG1 echo $ARG2
下面是一些如何工作的例子:
$ ./somecommand.sh foo bar $ ./somecommand.sh 1 1 bar $ ./somecommand able was i able was $ ./somecommand.sh "able was i" able was i bar $ ./somecommand "able was i" super able was i super $ ./somecommand.sh "able was i" "super duper" able was i super duper $ ./somecommand.sh "" "super duper" foo super duper
if [ ! -z $1 ] then : # $1 was given else : # $1 was not given fi
你可以用$#
来检查参数的数量
#!/bin/bash if [ $# -ge 1 ] then $1 else foo fi
请不要忘记,如果它的variables$ 1 .. $ n你需要写一个正则variables来使用replace
#!/bin/bash NOW=$1 echo ${NOW:-$(date +"%Y-%m-%d")}
对于可选的多个参数,类似于可以接受一个或多个文件的ls
命令,或者默认列出当前目录中的所有内容:
if [ $# -ge 1 ] then files="$@" else files=* fi for f in $files do echo "found $f" done
对于path中有空格的文件无法正常工作,唉。 还没有想出如何使这项工作呢。
可以使用variablesreplace来replace固定值或命令(如date
)作为参数。 到目前为止的答案都集中在固定值,但这是我用来使date成为一个可选参数:
~$ sh co.sh 2017-01-05 ~$ sh co.sh 2017-01-04 2017-01-04 ~$ cat co.sh DAY=${1:-$(date +%F -d "yesterday")} echo $DAY