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

目前我的剧本是

#!/bin/bash
somecommand foo

但我想说:

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

当前回答

你可以使用默认值语法:

somecommand ${1:-foo}

如上所述,Bash参考手册- 3.5.3 Shell参数扩展[强调矿]:

如果parameter未设置或为空,则替换word的展开。否则,参数的值将被替换。

如果你只想在参数未设置的情况下替换一个默认值(但如果它为空,例如,如果它是空字符串则不替换),请使用以下语法:

somecommand ${1-foo}

再次从Bash参考手册- 3.5.3 Shell参数展开:

省略冒号只会对未设置的参数进行测试。换句话说,如果包含冒号,操作符将测试两个参数是否存在,并且其值不为空;如果省略冒号,操作符只测试是否存在。

其他回答

你可以使用默认值语法:

somecommand ${1:-foo}

如上所述,Bash参考手册- 3.5.3 Shell参数扩展[强调矿]:

如果parameter未设置或为空,则替换word的展开。否则,参数的值将被替换。

如果你只想在参数未设置的情况下替换一个默认值(但如果它为空,例如,如果它是空字符串则不替换),请使用以下语法:

somecommand ${1-foo}

再次从Bash参考手册- 3.5.3 Shell参数展开:

省略冒号只会对未设置的参数进行测试。换句话说,如果包含冒号,操作符将测试两个参数是否存在,并且其值不为空;如果省略冒号,操作符只测试是否存在。

您可以使用$#检查参数的数量

#!/bin/bash
if [ $# -ge 1 ]
then
    $1
else
    foo
fi

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

 > cat mosh.sh
   set -- ${1:-xyz} ${@:2:$#} ; echo $*    
 > mosh.sh
   xyz
 > mosh.sh  1 2 3
   1 2 3 
if [ ! -z $1 ] 
then 
    : # $1 was given
else
    : # $1 was not given
fi

你可以像这样为一个变量设置一个默认值:

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