我希望我的脚本能够接受一个可选的输入,

目前我的剧本是

#!/bin/bash
somecommand foo

但我想说:

#!/bin/bash
somecommand  [ if $1 exists, $1, else, foo ]

当前回答

if [ ! -z $1 ] 
then 
    : # $1 was given
else
    : # $1 was not given
fi

其他回答

if [ ! -z $1 ] 
then 
    : # $1 was given
else
    : # $1 was not given
fi

对于可选的多个参数,类似于ls命令,它可以接受一个或多个文件,或默认列出当前目录中的所有内容:

if [ $# -ge 1 ]
then
    files="$@"
else
    files=*
fi
for f in $files
do
    echo "found $f"
done

对于路径中有空格的文件不能正确工作,唉。还不知道该怎么做。

您可以使用$#检查参数的数量

#!/bin/bash
if [ $# -ge 1 ]
then
    $1
else
    foo
fi

可以使用变量替换将固定值或命令(如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

这允许为可选的第一个参数设置默认值,并保留多个参数。

 > cat mosh.sh
   set -- ${1:-xyz} ${@:2:$#} ; echo $*    
 > mosh.sh
   xyz
 > mosh.sh  1 2 3
   1 2 3