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

时间:2012-02-17 17:32:53

标签: bash arguments parameter-passing

我希望我的脚本能够进行可选输入,

e.g。目前我的脚本是

#!/bin/bash
somecommand foo

但我想说:

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

8 个答案:

答案 0 :(得分:572)

您可以使用默认值语法:

somecommand ${1:-foo}

如上所述Bash Reference Manual - 3.5.3 Shell Parameter Expansion [强调我的]:

  

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

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

somecommand ${1-foo}

再次来自Bash Reference Manual - 3.5.3 Shell Parameter Expansion

  

省略冒号只会导致对未设置的参数进行测试。换句话说,如果包含冒号,运算符将测试参数的存在性及其值不为空;如果省略冒号,则运算符仅测试是否存在。

答案 1 :(得分:229)

您可以为变量设置默认值,如下所示:

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

答案 2 :(得分:40)

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

答案 3 :(得分:19)

您可以使用$#

检查参数的数量
#!/bin/bash
if [ $# -ge 1 ]
then
    $1
else
    foo
fi

答案 4 :(得分:7)

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

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

答案 5 :(得分:3)

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

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

对于路径中包含空格的文件,它无法正常工作,唉。还没弄明白如何完成这项工作。

答案 6 :(得分:2)

这允许可选的1st arg的默认值,并保留多个args。

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

答案 7 :(得分:1)

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