提问人:Abe 提问时间:2/18/2012 最后编辑:AmirAbe 更新时间:8/21/2023 访问量:457810
如何编写一个采用可选输入参数的 bash 脚本?
How to write a bash script that takes optional input arguments?
问:
我希望我的脚本能够接受可选输入,
例如,目前我的脚本是
#!/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
评论
-n
与 相同。! -z
-n
! -z
[ -n $1 ]
[[ -n $1 ]]
[ -n "$1" ]
您可以使用以下命令检查参数的数量$#
#!/bin/bash
if [ $# -ge 1 ]
then
$1
else
foo
fi
您可以使用默认值语法:
somecommand ${1:-foo}
如 Bash 参考手册 - 3.5.3 Shell 参数扩展 [强调我的]中所述:
如果参数未设置或为 null,则替换单词的扩展。否则,将替换 parameter 的值。
如果只想在参数未设置时替换默认值(但如果参数为 null,则不替换默认值,例如,如果它是空字符串,则不替换默认值),请改用以下语法:
somecommand ${1-foo}
再次来自 Bash 参考手册 - 3.5.3 Shell 参数扩展:
省略冒号将导致仅对未设置的参数进行测试。换句话说,如果包含冒号,运算符将测试这两个参数是否存在,并且其值是否为空;如果省略冒号,则操作员仅测试是否存在。
评论
foo
$1
${1-foo}
foo
$1
请不要忘记,如果它的可变 $1 ..$n 您需要写入常规变量才能使用替换
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
评论
DAY=${1:-$(date +%F -d "yesterday")}
您可以为变量设置默认值,如下所示:
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 artisan,我将其放入我的 .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: }) 将只是空格
- Artisan cache:clear -- 第一个参数 ( ${1: } ) 将是 cache:clear,所有其他参数都只是空格
因此,在这种情况下,我可以选择传递 7 个参数。
我希望它可以帮助某人。
while getopts a: flag
do
case "$flag" in
a) arg1=${OPTARG};;
esac
done
echo "Print optional argument: $arg1"
if [[ -z "$arg1" ]]; then
ARG=DEFAULT_VAL
else
ARG=$arg1
fi
#Run using below command (eg: file name : runscript.sh)
bash runscript.sh -a argument_val &
评论