如何编写一个带有可选输入参数的bash脚本?
我希望我的脚本能够获取可选输入,
例如 目前我的剧本是
#!/bin/bash
somecommand foo
但我想说:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
8个解决方案
493 votes
您可以使用default-value语法:
somecommand ${1:-foo}
以上将如Bash参考手册中所述 - 3.5.3 Shell参数扩展[强调我的]:
如果参数未设置或为null,则替换单词的扩展。 否则,参数的值将被替换。
如果您只想在未设置参数时替换默认值(但如果它为空,则不是,例如,如果它是空字符串则不是),请使用以下语法:
somecommand ${1-foo}
再次从Bash参考手册 - 3.5.3 Shell参数扩展:
省略冒号只会导致对未设置的参数进行测试。 换句话说,如果包含冒号,运算符将测试参数的存在性及其值不为空; 如果省略冒号,则运算符仅测试是否存在。
Itay Perl answered 2019-02-02T05:30:03Z
183 votes
您可以为变量设置默认值,如下所示:
somecommand.sh
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
以下是一些如何工作的示例:
$ ./somecommand.sh
foo
bar
1
Thu Mar 29 10:03:20 ADT 2018
$ ./somecommand.sh ez
ez
bar
1
Thu Mar 29 10:03:40 ADT 2018
$ ./somecommand.sh able was i
able
was
i
Thu Mar 29 10:03:54 ADT 2018
$ ./somecommand.sh "able was i"
able was i
bar
1
Thu Mar 29 10:04:01 ADT 2018
$ ./somecommand.sh "able was i" super
able was i
super
1
Thu Mar 29 10:04:10 ADT 2018
$ ./somecommand.sh "" "super duper"
foo
super duper
1
Thu Mar 29 10:05:04 ADT 2018
$ ./somecommand.sh "" "super duper" hi you
foo
super duper
hi
you
Brad Parks answered 2019-02-02T05:30:40Z
36 votes
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
Irit Katriel answered 2019-02-02T05:30:55Z
16 votes
您可以使用$#检查参数的数量
#!/bin/bash
if [ $# -ge 1 ]
then
$1
else
foo
fi
Dennis answered 2019-02-02T05:31:18Z
7 votes
请不要忘记,如果它的变量$ 1 .. $ n你需要写一个常规变量来使用替换
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
hagen answered 2019-02-02T05:31:41Z
3 votes
对于可选的多个参数,可以类推ls命令,该命令可以接受一个或多个文件,或者默认列出当前目录中的所有内容:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
对于路径中包含空格的文件,它无法正常工作,唉。 还没弄明白如何做到这一点。
Jesse Glick answered 2019-02-02T05:32:11Z
1 votes
可以使用变量替换来替换固定值或命令(如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
Garren S answered 2019-02-02T05:32:33Z
1 votes
这允许可选1st arg的默认值,并保留多个args。
> cat mosh.sh
set -- ${1:-xyz} ${@:2:$#} ; echo $*
> mosh.sh
xyz
> mosh.sh 1 2 3
1 2 3
mosh answered 2019-02-02T05:32:55Z