[英]echo combinations with special character as elements
我有一個小腳本,利用回聲能力生成元素組合。 那是一段代碼,
set={1,2,3,4}
group=3
for ((i=0; i<$group; i++));
do
repetition=$set$repetition
done
bash -c "echo "$repetition""
這工作正常,問題來自我希望集合由一些特殊字符組成,如逗號,parenthesys等。我嘗試過scape但它似乎不起作用,類似於
set={(,),\,,=}
關於如何實現它的任何線索?
你需要引用和逃避:
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
((( (() ((, ()( ()) (), (,( (,) (,, )(( )() )(, ))( ))) )), ),( ),) ),, ,(( ,() ,(, ,)( ,)) ,), ,,( ,,) ,,,
雖然@ fedorqui的答案是要走的路,但這里有更多關於完整性的信息。 你知道特殊字符需要被轉義,但是\\
本身是一個特殊的字符,所以當你將它傳遞給另一個bash實例時,也需要進行轉義。
因此,當您在腳本中set={(,)}
時,由於括號,您的腳本將拋出語法錯誤。 一旦你以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 `('
所以,回到原點。 你要做的就是逃避逃脫逃跑的逃生1 :
$ set={\\\(,\\\)}
$ echo "Parent3: $set"
Parent3: {\(,\)}
$ bash -c "echo Child3 "$set""
Child3 ( )
在這里,子實例最終被傳遞它需要看到的內容: {\\(,\\)}
。 因此,雖然在這種情況下並不是絕對必須使用引號,但它們確實讓您的生活更加輕松:
1 盡量快說 5倍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.