2011-08-08 21 views
5

下面的命令Linux/Bash:如何取消引用?

echo 'a b' 'c' 

輸出

a b c 

但下面

X="'a b' 'c'" 
echo $X; 

將outout

'a b' 'c' 

我正在尋找一種方式來取消引用$ X,以便輸出「a b c」,但不會丟失合併的「b」參數。 (= 2點的參數,而不是如圖3所示,使得對於命令「迴響」沒有差別,但對其他的命令,如「CP」)

+2

echo $ {X // \'/}; // a b c –

回答

7

嘗試xargs的:

$ echo $x 
'a b' 'c' 

$ echo $x | xargs ./echo 
argc = 3 
argv[0] = ./echo 
argv[1] = a b 
argv[2] = c 
+0

注意:xargs無法返回進程的退出狀態。任何錯誤1-125將顯示爲123.(可能沒有解決方法可用)我可能會使用eval代替,以便能夠使用exitcode –

0

這是毛,我建議周圍工作這個問題並且不首先連接「ab」和「c」。

7
eval echo $x 

這將通過a b作爲第一個參數,c作爲第二個

注:這實際上是將評估參數,如:

$ x='$((3+5))' 
$ eval echo $x 
8 

如果這不是你想要使用@ vanza的什麼xargs

+0

謝謝。我還沒有使用「eval」,但似乎xargs根據腳本注入更安全。 –

0
X="'a b' 'c'" 
echo $X 
eval "echo $X" 

當您使用此代碼,你必須要小心,如果X都不可能包含像\"$或反引號特殊字符。

0

您確定echo收到echo $X中的2個參數嗎?對我來說,它接收3.讓我們試着:

X="'a b' 'c'" 
function f(){ echo $#; echo $1; echo $2; echo $3; } 
f $X 

顯示:

3 
'a 
b' 
'c' 

的3個參數是'ab''c'。我不認爲這是你所期望的。

如果你想建立一個多參數變量,IFS設爲您不會使用(也許|),並使用它作爲您的變量參數分隔符字符:如果你的

X="a b|c" 
IFS="|" 
function f(){ echo $#; echo $1; echo $2; } 
f $X 
1

一般正在嘗試存儲多個‘單詞’在單個變量,推薦的方法是不使用嵌入式引號,但使用數組:

X=('a b' 'c') 
printf "%s\n" "${X[@]}" 

打印:

a b 
c 
0

也可以組合xargssh -c 'cmd' _ arg1 arg2 ...將參數重新分解到位置參數數組[email protected]中。

分配輸出到一個變量,重定向什麼,但最後一個進程的退出狀態$?stderr,例如,使得它可以存儲的最後一個進程的退出代碼中的變量,並用它xargs結束後執行。

X="'a b' 'c'" 

ret="$(
export IFS='' 
set -o pipefail 
echo $X | xargs sh -c ' 
    for file in "[email protected]"; do 
     echo cp "$file" destdir 1>&2 || { echo $?; kill -HUP $PPID; exit $?; } 
     #(exit 3) || { echo $?; kill -HUP $PPID; exit $?; } 
     #(exit 3) || { echo $?; kill -HUP $PPID; kill -HUP -- -$$; } 
    done 
    echo $? 
' _ 
echo $? '|' ${PIPESTATUS[@]} 1>&2 
)" 
echo "$ret" | tail -1 
0

請不要使用eval這樣的東西。 set會保持參數的完整性,而echo以外的其他命令會和它們一起玩。請記住,您將失去對任何當前位置參數的引用。

set -- "a b" "c" 
echo "[email protected]" 
#a b c 
echo $1 
#a b 
echo $2 
#c