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

问题描述 投票:0回答:10

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

例如目前我的脚本是

#!/bin/bash
somecommand foo

但我想说:

#!/bin/bash
somecommand  [ if $1 exists, $1, else, foo ]
bash arguments parameter-passing
10个回答
1056
投票

您可以使用默认值语法:

somecommand ${1:-foo}

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

如果参数未设置或为空,则替换单词的扩展。否则,将替换参数的值。

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

somecommand ${1-foo}

再次摘自 Bash 参考手册 - 3.5.3 Shell 参数扩展

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


529
投票

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

一些命令.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

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

31
投票

您可以使用

$#

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

12
投票

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

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

9
投票

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

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

5
投票

对于可选的 multiple 参数,类似于

ls
命令,它可以获取一个或多个文件,或者默认列出当前目录中的所有内容:

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

对于路径中带有空格的文件无法正常工作,唉。还没有弄清楚如何使其发挥作用。


4
投票

可以使用变量替换来替换参数的固定值或命令(如

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

1
投票
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 &  

-1
投票

当您使用 ${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 个参数。

我希望它可以帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.