给定一个在 bash 中的字符串变量(不是字符串),如何扩展其花括号(并且匹配任何文件通配符,例如星号),然后将结果扩展存储到一个数组中?
我知道可以使用eval
实现:
#!/usr/bin/env bash
string="{a,b}{1,2}"
array=( $( eval echo $string ) )
echo "${array[@]}"
#a1 a2 b1 b2
但是,如果我们不信任字符串(比如说它是脚本的参数),
eval
可能是危险的。一个包含分号、引号、空格、任意命令等内容的字符串会打开脚本的漏洞。在bash中有更安全的方法进行这种扩展吗?我怀疑以下所有方式都同样 不安全:
#!/usr/bin/env bash
eval echo $string
bash <<< "echo $string"
echo echo $string | bash
bash <(echo echo $string)
除了bash之外,我们是否可以将该字符串管道传输到其他命令中进行扩展呢?
另外请注意,在csh/tcsh中这很容易实现,因为花括号扩展发生在变量替换之后(不像bash):
#!/usr/bin/env csh
set string = "{a,b}{1,2}"
set array = ( $string )
echo "$array"
#a1 a2 b1 b2
eval
!尝试arr=({1,2}); declare -p arr
。 - Benjamin W.'a{b,c}*'
这样的东西会更好。当然,这会使其他事情更加困难,但这是非常规的方法。除此之外,我真的很想看到问题的答案,而不是像我的评论一样(试图说服你不要做你想做的事 :))。 - Socowieval
,要么重构了用户的特定问题以避免在第一次出现时使用大括号字符串。这在我的应用程序中并不容易。 - AWitt