如何编写一个采用可选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