2014-08-28 77 views
1

我有以下兩個命令shell腳本:我該如何修復sed無效的命令代碼?

sedcmd1="sed -i '' '/<PromptOnUpdate>true<\/PromptOnUpdate>/G' /Users/abc/data.xml" 
$sedcmd1 

當我運行該腳本,我得到以下錯誤:

sed: 1: "'/<PromptOnUpdate ...": invalid command code ' 

如果我不把它分配給變量運行的命令,它運行正好。但只有當我將它分配給一個變量並從那裏執行時纔會出錯。

我需要變量中的命令來滿足我的需要,因爲我嘗試接收命令作爲shell腳本的參數。

片段data.xml中的:

<?xml version="1.0" ?> 
<Settings Version="1.0.0"> 
    <Android> 
     <PromptOnUpdate>true</PromptOnUpdate> 
    </Android> 
</Settings> 

感謝您看這個!

PS:我在Mac OSX小牛隊

回答

4

擴展變量後未處理引號。您需要使用eval

eval "$sedcmd1" 
+2

或者更好的是,[不這樣做(http://mywiki.wooledge.org/BashFAQ/050)。 – tripleee 2014-08-28 04:33:31

+0

工程就像一個魅力。非常感謝! – user1819441 2014-08-28 16:20:47

+0

請注意,@ John1024答案中的數組技術通常被認爲是更好的解決方案。如果你在命令中嵌套了引號,他們很難處理使用'eval'。 – Barmar 2014-08-28 17:56:54

1

shell在擴展變量之前會處理引號。這意味着變量中的引號沒有魔法;他們被視爲與其他角色一樣。

要存儲一個複雜的命令作爲變量,你需要一個數組:

sedcmd1=(sed -i '' '/<PromptOnUpdate>true<\/PromptOnUpdate>/G' data.xml) 

該陣列可以執行:

${sedcmd1[@]} 

如果您不確定如果您已經定義了數組的性格,您可以使用declare命令隨時查看其中的內容;

declare -p sedcmd1 

這將產生:

declare -a sedcmd1='([0]="sed" [1]="-i" [2]="" [3]="/<PromptOnUpdate>true<\\/PromptOnUpdate>/G" [4]="data.xml")'