我有一个小脚本,它利用回声功能生成元素组合。那是代码片段,
set={1,2,3,4}
group=3
for ((i=0; i<$group; i++));
do
repetition=$set$repetition
done
bash -c "echo "$repetition""
这很好用,当我想让这个集合由一些特殊字符组成时,问题就出现了,比如逗号,父母等等。我尝试过scape但它似乎不起作用,比如
set={(,),\,,=}
关于如何实现它的任何线索?
答案 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次。