我刚刚发现了一个bash我不明白的奇怪行为.表达方式
${variable:=default}
Run Code Online (Sandbox Code Playgroud)
如果尚未设置,则设置variable为该值default.请考虑以下示例:
#!/bin/bash
file ${foo:=$1}
echo "foo >$foo<"
file ${bar:=$1} | cat
echo "bar >$bar<"
Run Code Online (Sandbox Code Playgroud)
输出是:
$ ./test myfile.txt
myfile.txt: ASCII text
foo >myfile.txt<
myfile.txt: ASCII text
bar ><
Run Code Online (Sandbox Code Playgroud)
您会注意到变量foo被赋值为$1但变量bar不是,即使它的默认结果被显示给file命令.
如果删除无害管进入cat从第4行并重新运行它,然后它都foo并bar获得设定的值$1
我在这里错过了什么,或者这可能是一个bash错误?
(GNU bash,版本4.3.30)
在第二种情况下file是管道构件并且在其自己的壳中作为每个管道构件运行.当file其子shell结束时,$b其新值$1不再存在.
解决方法:
#!/bin/bash
file ${foo:=$1}
echo "foo >$foo<"
: "${bar:=$1}" # Parameter Expansion before subshell
file $bar | cat
echo "bar >$bar<"
Run Code Online (Sandbox Code Playgroud)