我对bash(3.00)shell脚本中的变量进行了大量测试,如果没有设置该变量,那么它将指定一个默认值,例如:
if [ -z"${VARIABLE}" ]; then
FOO='default'
else
FOO=${VARIABLE}
fi
我似乎记得在一行中这样做有一些语法,类似于三元运算符,例如:
FOO=${ ${VARIABLE} : 'default' }
(尽管我知道那不管用…)
我是疯了,还是存在这样的东西?
bash shell引用的shell参数扩展部分是一个很好的起点:tiswww.case.edu/php/chet/bash/bashref.html shell扩展。
用于shell参数扩展的gnu.org文档(提示:还有很多其他很酷的东西可以做!)
实际上,非常接近你发布的内容:
FOO=${VARIABLE:-default} # If variable not set or null, use default.
或者,也可以将default分配给VARIABLE:
FOO=${VARIABLE:=default} # If variable not set or null, set it to default.
如果我想在文档中找到这个,那么谷歌会做什么呢?使用诸如$:-这样的特殊字符进行谷歌搜索并不容易。
作为对solarmist的回应:"bash variable assignment default"让我进入这个页面,并用"variable ass"搜索bash的手册页面,在~5'下一个'之后让我进入正确的部分。
请注意,它不是bash特定的,将与整个shell系列一起工作。它对通用脚本是安全的。
有人知道这是为什么吗?:-,:=语法相当神秘…
@solarmist的关键词是"bash参数扩展",如果您想了解更多关于它及其伙伴的信息。
-和:=之间的区别是什么?
@Jocelyndelaland我确认:我尝试在一个共同的配置文件中,它是由我在Git版本的家中使用的bash和zsh提供的,它在这两者上都很好地工作。
@andrew the:=在许多其他的shell替换语句中非常清晰和直观。
我用了这些术语best way to set var defaults in shell script。把我弄到这儿来了。
subjectAltname=$1:-$subject_alt_name:-$defaultSubjectAltna‌&8203;我…是3个选项的语法…这里的第一个默认值是传递给脚本的第一个参数,否则使用env变量,否则使用脚本变量。
下面是关于unix.stackexchange.com/a/122848/2407主题的更深入的解释。
@乔舒奥尔森·埃多克斯(Joshualson EDOCX1)(1)
这一页有一个很好的备忘单解释了所有这些:stackoverflow.com/a/1675353536/5359531
如果我想使用shell命令而不是变量呢?例如:foo=$cat some_file—-null
这在Bourne Shell的/bin/sh中有效,还是只在bash(和ksh,zsh中有效?
@乔舒奥尔森谷歌"bash env or default"把我带到这里:—)
对于命令行参数:
VARIABLE=${1:-DEFAULTVALUE}
它将传递给脚本的第一个参数的值赋给VARIABLE,如果没有传递该参数,则赋给DEFAULTVALUE的值。
如果变量相同,则
:"${VARIABLE:=DEFAULT_VALUE}"
如果未定义,将默认值赋给变量。双引号可防止全局搜索和分词。
另请参见bash手册第3.5.3节"shell参数扩展"。
我发现自己一次又一次地提到这个!!!!
这一诡计对我来说并不明显,它使用了内置的:无效果(no-effect)来吃美元的膨胀,但留下了变量集。到目前为止,我一直在这样做:variable="$variable:-default"并且对于使用变量两次感到很笨拙。
事实证明,这并不总是适用于bash-builtin变量。这很奇怪。目前我所知道的是HISTTIMEFORMAT。
如何设置多个默认值?我试过":$variable:=默认值:$variable2:=默认值",但这似乎不起作用…
@汉斯:冒号是命令(什么都不做),因此只需要一次。如: ${FOO:=DEFAULT1} ${BAR:=DEFAULT2}。
即使您可以像默认值一样使用另一个变量的值
有文件的
#!/bin/bash
variable1=$1
variable2=${2:-$variable1}
echo $variable1
echo $variable2
运行./defvalue.sh first-value second-value输出
first-value
second-value
运行./defvalue.sh first-value输出
first-value
first-value
感谢您展示一个1美元2美元的示例…
见3.5.3节(外壳参数扩展)
所以在你的情况下
${VARIABLE:-default}
回答你的问题和所有变量替换
echo"$\{var}"
echo"Substitute the value of var."
echo"$\{var:-word}"
echo"If var is null or unset, word is substituted for var. The value of var does not change."
echo"2- $\{var:=word}"
echo"If var is null or unset, var is set to the value of word."
echo"$\{var:?message}"
echo"If var is null or unset, message is printed to standard error. This checks that variables are set correctly."
echo"$\{var:+word}"
echo"If var is set, word is substituted for var. The value of var does not change."
还有一种方法可以更简洁地表达你的"if"结构:
FOO='default'
[ -n"${VARIABLE}" ] && FOO=${VARIABLE}
这有利于与早期外壳的X兼容性
这有利于与OSXbash兼容。
fwiw,您可以提供这样的错误消息:
USERNAME=${1:?"Specify a username"}
这将显示类似这样的消息,并退出代码1:
./myscript.sh
./myscript.sh: line 2: 1: Specify a username
更完整的例子:
#!/bin/bash
ACTION=${1:?"Specify 'action' as argv[1]"}
DIRNAME=${2:-$PWD}
OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}}
echo"$ACTION"
echo"$DIRNAME"
echo"$OUTPUT_DIR"
输出:
$ ./script.sh foo
foo
/path/to/pwd
/tmp
$ export HOMEDIR=/home/myuser
$ ./script.sh foo
foo
/path/to/pwd
/home/myuser
$ACTION取第一个参数的值,如果为空则退出
$DIRNAME是第二个参数,默认为当前目录
$OUTPUT_DIR是第三个参数,或$HOMEDIR(如有定义),否则,/tmp。这在OSX上有效,但我不确定它是便携式的。
下面是一个例子
#!/bin/bash
default='default_value'
value=${1:-$default}
echo"value: [$value]"
将此保存为script.sh并使其可执行。不带参数运行
./script.sh
> value: [default_value]
用参数运行它
./script.sh my_value
> value: [my_value]