簡體   English   中英

具有特殊字符作為元素的回聲組合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM