如何编写一个接受可选输入参数的bash脚本?

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

例如,目前我的脚本是

#!/bin/bash
somecommand foo

但我想说:

#!/bin/bash
somecommand  [ if $1 exists, $1, else, foo ]
407649 次浏览
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi

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

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

您可以使用默认值语法:

somecommand ${1:-foo}

Bash参考手册-3.5.3 Shell参数扩展[强调我的]中所述,上述内容将:

如果参数未设置或null,则替换word的扩展。否则,替换参数的值。

如果您只想在参数未设置时替换默认值(但如果它为null则不替换,例如如果它是空字符串则不替换),请改用以下语法:

somecommand ${1-foo}

来自Bash参考手册-3.5.3 Shell参数扩展

省略冒号只会对未设置的参数进行测试。换句话说,如果包含冒号,操作符将测试这两个参数的存在及其值不为空;如果省略冒号,操作符仅测试存在。

请不要忘记,如果它的变量1美元…$n 您需要写入常规变量才能使用替换

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

您可以像这样为变量设置默认值:

somecommand.sh

#!/usr/bin/env bash


ARG1=${1:-foo}
ARG2=${2:-'bar is'}
ARG3=${3:-1}
ARG4=${4:-$(date)}


echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"

以下是一些如何工作的例子:

$ ./somecommand.sh
foo
bar is
1
Thu 19 May 2022 06:58:52 ADT


$ ./somecommand.sh ez
ez
bar is
1
Thu 19 May 2022 06:58:52 ADT


$ ./somecommand.sh able was i
able
was
i
Thu 19 May 2022 06:58:52 ADT


$ ./somecommand.sh "able was i"
able was i
bar is
1
Thu 19 May 2022 06:58:52 ADT


$ ./somecommand.sh "able was i" super
able was i
super
1
Thu 19 May 2022 06:58:52 ADT


$ ./somecommand.sh "" "super duper"
foo
super duper
1
Thu 19 May 2022 06:58:52 ADT


$ ./somecommand.sh "" "super duper" hi you
foo
super duper
hi
you

对于可选的多个参数,与ls命令类比,该命令可以获取一个或多个文件,或者默认列出当前目录中的所有内容:

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

对于路径中有空格的文件不能正常工作,唉。还没有弄清楚如何使其工作。

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

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

例如。为了能够使用Laravel工匠,我将其放入我的.bash_aliases文件中:

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

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

  • artisan--所有参数(${1:}${2:}${3:}${4:}${5:}${6:}${7:})将只是空格
  • 工匠缓存:清除——第一个参数(${1:})将是缓存:清除,所有其他参数将只是空格

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

我希望它能帮助别人。