如何在变量声明中使用Bash替换2

时间:2016-04-02 15:13:41

标签: bash

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={.,.,.}不会触发大括号扩展?

3 个答案:

答案 0 :(得分:2)

Scalars Aren' t Arrays

要执行您想要的操作,您需要将 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