2013-03-28 46 views
1

我似乎在獲取我想要的工作時遇到了一些困難。基本上,我有一系列變量,它們被分配了帶有一些引號和\字符的字符串。我想刪除引號將它們嵌入到json文檔中,因爲json不喜歡使用python轉儲方法引用引號。變量替換消除引號

我覺得這很容易。只需確定如何輕鬆刪除字符,然後爲變量替換編寫一個簡單的for循環,那麼它就不會以這種方式工作。

這是我想要做的。

有一個名爲「MESSAGE23」的變量,它包含以下「com.centrify.tokend.cac」,我想刪除引號,這對我來說很簡單,簡單的echo $opt | sed "s/\"//g"。當我做這個命令行:

$> MESSAGE23="com."apple".cacng.tokend is present" 
$> MESSAGE23=`echo $MESSAGE23 | sed "s/\"//g"` 
$> com.apple.cacng.tokend is present 

這工作。我得到格式正確的字符串。

當我然後試圖把它扔到一個循環中時,所有的地獄崩潰了。

for i to {1..25}; do 
    MESSAGE$i=`echo $MESSAGE$i | sed "s/\"//g"` 
done 

這不工作(無論它拋出了一堆指標出來或沒有),我敢肯定,我只是不知道argeval或其他慶典替換變量足夠。

但基本上我想爲另一組具有相同問題的變量執行此操作,在這裏我將引號和附帶的「\」去掉。

任何幫助將不勝感激。

回答

3

你不能那樣做。您可以使用eval來使其工作,但這會引入您必須擔心的另一個引用級別。有沒有理由不能使用數組?

MESSAGE=("this is MESSAGE[0]" "this is MESSAGE[1]") 
MESSAGE[2]="I can add more, too!" 
for ((i=0; i<${#MESSAGE[@]}; ++i)); do 
    echo "${MESSAGE[i]}" 
done 

否則,你需要的東西是這樣的:

eval 'echo "$MESSAGE'"$i"'"' 

,它只是得到的情況更糟糕。

+0

yuck ..不,不反對使用數組?我有變量MESSAGE1-25,我應該把每一個都推到一個數組上,然後彈出每個關閉並替換它?我想我不知道我應該把這個數組放在哪裏? – 2013-03-28 00:37:14

+0

哦..我明白了。 MESSAGE是數組並彈出數組到該數組 – 2013-03-28 00:37:58

+0

右。你可以使用'MESSAGE1 = blah1','MESSAGE2 = blah2'等,而不是'MESSAGE1 = blah1','MESSAGE [0] = blah1','MESSAGE [1] = blah2'等等。或者像圓括號一樣初始化整個事物,或者使用'read -a'從文件中讀取它 - 這取決於這些變量是如何在應用程序中設置的。 – 2013-03-28 14:13:13

1

首先,幾個初步問題:MESSAGE23="com."apple".cacng.tokend is present"將不會在變量值中嵌入雙引號,請使用MESSAGE23="com.\"apple\".cacng.tokend is present"MESSAGE23='com."apple".cacng.tokend is present'來代替。其次,你應該總是在變量擴展周圍放置雙引號(例如echo "$MESSAGE23")以防止解析奇怪。

現在,真正的問題是:shell不允許在賦值左側進行變量替換(即MESSAGE$i=something將不起作用)。幸運的是,它確實允許在declare聲明中使用,所以您可以使用它。另外,當看到$MESSAGE$i時,它將替換它的值爲$MESSAGE,後面是值$i;爲此,您需要使用間接擴展(`$ {!metavariable}')。

for i in {1..25}; do 
    varname="MESSAGE$i" 
    declare $varname="$(echo "${!varname}" | tr -d '"')" 
done 

(請注意,我用的也是tr代替sed,不過這只是我個人的偏好。)

(另請注意,數組的@馬克裏德的建議真的是更好的方式來做到這一點那類的東西。)

+0

謝謝你們。從這裏學到了很多東西,將嘗試使用數組選項和使用聲明。謝謝 – 2013-03-29 01:31:49