2013-10-10 236 views
4

大括號我有一個字符串:逃避UNIX shell腳本

{2013/05/01},{2013/05/02},{2013/05/03}

我想追加{開頭和}結尾。輸出應該是:

{{2013/05/01},{2013/05/02},{2013/05/03}}

然而,在我的shell腳本時,我拼接大括號的字符串的開頭和結尾,輸出如下:

{2013/05/01} {2013/05/02} {2013/05/03}

爲什麼會發生?我怎樣才能達到我的結果?肯定有一個簡單的解決方案,但我是一個unix新手,因此會感謝一些幫助。

測試腳本:

#!/usr/bin/ksh 
valid_data_range="{2013/05/01},{2013/05/02},{2013/05/03}" 
finalDates="{"$valid_data_range"}" 
print $finalDates 

回答

1

你可以說:

finalDates=$'{'"$valid_data_range"$'}' 
+0

這在它自己不起作用;使用變量時必須防止擴展。換句話說,問題不在於任務。這是'print'命令。 –

+0

感謝大家的意見。因此,如果我想使用賦值變量,例如,如果我想將最終字符串傳遞給函數或將使用此變量的其他腳本(可能是python或perl腳本),那麼我該怎麼做? – axm2064

+0

在引用變量的任何位置使用''$ finalDates''或其變體(例如''{$ finalDates}''),並且不希望大括號擴展發生。 –

2

的問題是,外殼執行括號擴展。這可以讓你產生了一系列類似的字符串:

$ echo {a,b,c} 
a b c 

這不是很可觀,但考慮

$ echo a{b,c,d}e 
abc ace ade 

爲了抑制括號擴展,可以使用set命令暫時將其關閉

$ set +B 
$ echo a{b,c,d}e 
a{b,c,d}e 
$ set -B 
$ echo a{b,c,d}e 
abe ace ade 
2

的問題是,當你有一個括號列表之外的報價,外殼進行Brace Expansionbash人ual,但ksh將類似)。由於「外引號」位是很重要的,它也告訴您如何避免此類問題 - 用引號將字符串打印時:

#!/usr/bin/ksh 
valid_data_range="{2013/05/01},{2013/05/02},{2013/05/03}" 
finalDates="{$valid_data_range}" 
print "$finalDates" 

(該print命令是特定於ksh並沒有出現在bash。分配線的變化比功能更美觀。)

此外,在bash中不會發生支架擴展;它只發生在直接寫大括號的時候。此雙語腳本(kshbash):

valid_data_range="{2013/05/01},{2013/05/02},{2013/05/03}" 
finalDates="{$valid_data_range}" 
printf "%s\n" "$finalDates" 
printf "%s\n" $finalDates 

生產:

  1. ksh

    {{2013/05/01},{2013/05/02},{2013/05/03}} 
    {2013/05/01} 
    {2013/05/02} 
    {2013/05/03} 
    
  2. bash(也zsh

    {{2013/05/01},{2013/05/02},{2013/05/03}} 
    {{2013/05/01},{2013/05/02},{2013/05/03}} 
    

因此,當你需要使用可變$finalDates,確保它是雙引號:

other_command "$finalDates" 
if [ "$finalDates" = "$otherString" ] 
then : whatever 
else : something 
fi 

等 - 用你喜歡的佈局,無論你不喜歡我的。