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

目前我的剧本是

#!/bin/bash
somecommand foo

但我想说:

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

当前回答

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

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

其他回答

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

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

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

当你使用${1:}时,你可以捕获传递给你的函数的第一个参数(1),或者(:)你可以捕获一个像默认值一样的空格。

为例。为了能够使用Laravel artisan,我把它放在我的.bash_aliases文件中:

artisan() {
    docker exec -it **container_name** php artisan ${1: } ${2: } ${3: } ${4: } ${5: } ${6: } ${7: }
}  

现在,我可以在命令行输入:

工匠,所有参数(${1}{2}{3:}美元${4:}${5:}${6:}${7:})将空格 Artisan cache:clear——第一个参数(${1:})将是cache:clear,所有其他参数将是空白

在这种情况下,我可以选择传递7个参数。

我希望它能帮助到一些人。

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

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

请不要忘记,如果它是变量$1 ..$ n 您需要写入一个常规变量来使用替换

#!/bin/bash
NOW=$1
echo  ${NOW:-$(date +"%Y-%m-%d")}

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

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