2017-08-09 60 views
1

由於問題本身令人困惑,標題有點混淆。如何逃離嵌套bash命令返回的空間

先決條件:

我使用這個腳本script.sh作爲傳遞的參數遊樂場:

#!/bin/bash 

echo $1 
echo $2 
echo $3 

問題:

我希望這一呼籲

./script.sh $(echo "foo \"bar baz\"") 

的行爲究竟如

./script.sh foo "bar baz" 

相應地,我期望能獲得

foo 
bar baz 

的輸出結果,但它返回

foo 
"bar 
baz" 

很顯然,我需要逃避的東西。我懷疑這是一個空間,但我不確定。

問題:嵌套echo呼叫看起來應該像這樣,外部呼叫收到2個參數

PS:這是一個比較複雜腳本的簡化,但原來的呼叫的主要問題是保持。

回答

2

你不能這樣做。不管$(somecommand)將被視爲數據,而不是解釋爲shell語法,因此它中的任何引號和轉義將被簡單地視爲常規字符。這是你所看到的 - echo打印的雙引號被視爲./script.sh的參數的一部分,而不是作爲分隔符大約的論點。

另一種考慮這種情況的方法是shell在分析命令行時所經歷的過程。這裏有一個高度簡化的總結:

  1. 解析命令行,包括引號和轉義。請注意,在此過程中,引號和轉義將被刪除。
  2. 展開類似變量($var)和命令替換($()和反引號的命令)。
  3. 對這些擴展的結果執行分詞和通配符擴展(除非它們來自步驟1的雙引號)。

請注意,任何變量擴展或命令替換的結果都是命令行的一部分時,quote和escape解析已完成; shell不會將這些處理應用於這些擴展的結果。

現在,根據你實際要做的事情,可能有另一種方法來實現它。例如,可以使用readxargs來分割字符串,同時尊重其中的引號/轉義字符。還有eval,但要儘可能地避免這種情況發生 - 它具有當之無愧的臭蟲磁鐵的聲譽。

+0

是的,我認爲'echo「foo \」bar baz \「」| xargs。/ script.sh'是所有選項中最好的。謝謝。 – zerkms