具有特殊字符作为元素的回声组合

时间:2014-10-03 11:03:31

标签: bash shell brace-expansion

我有一个小脚本,它利用回声功能生成元素组合。那是代码片段,

set={1,2,3,4}
group=3
for ((i=0; i<$group; i++));
do
  repetition=$set$repetition
done

bash -c "echo "$repetition""

这很好用,当我想让这个集合由一些特殊字符组成时,问题就出现了,比如逗号,父母等等。我尝试过scape但它似乎不起作用,比如

set={(,),\,,=}

关于如何实现它的任何线索?

2 个答案:

答案 0 :(得分:2)

你需要引用和逃避:

set={1,2,3,"\'4\'"}

请注意,它与{1,2,3,4}一起使用,因为它是数字。对于字符串,您还需要引用:{1,2,3,'a'}

$ echo {1,2,3,'a'}{1,2,3,'a'}
11 12 13 1a 21 22 23 2a 31 32 33 3a a1 a2 a3 aa

然后转义是处理bash -c和值的执行。


根据您的评论,您的最终剧本是:

set={"\(","\)","\,"}
group=3
for ((i=0; i<$group; i++));
do
  repetition=$set$repetition
done

bash -c "echo "$repetition""

当我执行它时,我得到了这个,很好!

$ ./a
((( (() ((, ()( ()) (), (,( (,) (,, )(( )() )(, ))( ))) )), ),( ),) ),, ,(( ,() ,(, ,)( ,)) ,), ,,( ,,) ,,,

答案 1 :(得分:2)

虽然@ fedorqui的答案是要走的路,但这里有更多关于完整性的信息。您知道需要转义特殊字符,但\本身就是一个特殊字符,所以 也需要转义,因为您将它传递给另一个bash实例。

因此,当您的脚本中有set={(,)}时,由于括号,您的脚本将抛出语法错误。一旦你以set={\(,\)}的形式逃脱它们,你的脚本就可以了但是已经将它们传递给你的bash -c,而set={( )}会看到$ set={\(,\)}; echo Parent: "$set"; bash -c "echo Child1: "$set"" Parent: {(,)} bash: -c: line 0: syntax error near unexpected token `(' bash: -c: line 0: `echo Child1: {(,)}' 并扼杀它,给出相同的语法错误:

\

显而易见的解决方案是逃避反斜杠本身,以便正确传递它们。但是,转义会导致角色失去其特殊权力,因此转义$ set={\\(,\\)}; bash: syntax error near unexpected token `(' 会阻止它逃脱括号:

$ set={\\\(,\\\)}
$ echo "Parent3: $set"
Parent3: {\(,\)}
$ bash -c "echo Child3 "$set""
Child3 ( )

所以,回到原点。你要做的就是逃避逃离逃逸 1

{\(,\)}

这里,子实例最终被传递了它需要看到的内容:{{1}}。因此,虽然在这种情况下并不是绝对必须使用引号,但它们确实让您的生活更加轻松:


1 尝试快速说出 5次。