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

如何编写一个带有可选输入参数的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值