How to use Bash substitution in a variable declaration
你们中的一些人可能已经阅读了上述问题但我留下的问题多于答案。我试着谷歌搜索bash标记 - >扩展工作细节但没有找到正确的答案。
让我们看一下简单的例子:
q="www"
e=$q{.,.,.}
echo $e
#outputs: www{.,.,.}
现在这不会像我期望的那样起作用。特别是因为echo $q{.,.,.}
输出www. www. www.
正如我所期望的那样。在第一个SO问题中有一些消息要写set $q{.,.,.,1} & s="$@" & echo $s
这在终端中有效但由于某些原因在.sh脚本中输入时会输出www{.,.,.}
为什么脚本和终端之间存在不同的行为以及如何确保触发扩展?
另外,为什么q=*
触发路径名扩展但q={.,.,.}
不会触发大括号扩展?
答案 0 :(得分:2)
要执行您想要的操作,您需要将 e 指定为数组。然后,您可以使用array expansion以您期望的方式查看内容。请考虑以下事项:
q="www"
e=( $q{.,.,.} )
echo "${e[@]}"
万维网。万维网。万维网。
答案 1 :(得分:1)
bash执行扩展in a defined order,并且在参数扩展之前发生支撑扩展。
当bash看到echo $e
时,没有大括号扩展要执行。在参数扩展之后,bash不会回到之前的那个。
如果您需要,可以执行以下操作之一:
e=$(echo $q{.,.,.}); echo "$e"
e=$q{.,.,.}; eval echo "$e"
答案 2 :(得分:1)
作业右侧的单词不会:“Brace Expand”
来自“man bash”(强调我的):
可以通过表单
的语句分配变量name=[value]
所有值都经过代码扩展,参数和变量扩展,命令替换,算术扩展和引用删除
没有提及“Brace Expansion”,“Pathname expansion”或“splitting”。
要获得“Brace扩展”,请将其命名为命令行(请注意"$q"
已引用):
$ q="www"
$ e="$( echo "$q"{.,.,.} )"
$ echo "$e"
www. www. www.
或者,如果您想要一个数组(在链接问题中询问),请直接使用:
$ e=( "$q"{.,.,.} )
$ printf '<%s> ' "${e[@]}"; echo ### No, `$e` is not enough.
<www.> <www.> <www.>
为什么q = *触发路径名扩展
不,它没有:
$ a=* ; echo "$a"
*
当然,不带引号的$a
将进行路径名扩展,请尝试:
$ a=* ; echo $a