下面的命令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」)
下面的命令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」)
嘗試xargs的:
$ echo $x
'a b' 'c'
$ echo $x | xargs ./echo
argc = 3
argv[0] = ./echo
argv[1] = a b
argv[2] = c
注意:xargs無法返回進程的退出狀態。任何錯誤1-125將顯示爲123.(可能沒有解決方法可用)我可能會使用eval代替,以便能夠使用exitcode –
這是毛,我建議周圍工作這個問題並且不首先連接「ab」和「c」。
eval echo $x
這將通過a b
作爲第一個參數,c
作爲第二個
注:這實際上是將評估參數,如:
$ x='$((3+5))'
$ eval echo $x
8
如果這不是你想要使用@ vanza的什麼xargs
。
謝謝。我還沒有使用「eval」,但似乎xargs根據腳本注入更安全。 –
X="'a b' 'c'"
echo $X
eval "echo $X"
當您使用此代碼,你必須要小心,如果X
都不可能包含像\"$
或反引號特殊字符。
您確定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個參數是'a
,b'
和'c'
。我不認爲這是你所期望的。
如果你想建立一個多參數變量,IFS設爲您不會使用(也許|
),並使用它作爲您的變量參數分隔符字符:如果你的
X="a b|c"
IFS="|"
function f(){ echo $#; echo $1; echo $2; }
f $X
一般正在嘗試存儲多個‘單詞’在單個變量,推薦的方法是不使用嵌入式引號,但使用數組:
X=('a b' 'c')
printf "%s\n" "${X[@]}"
打印:
a b
c
也可以組合xargs
和sh -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
請不要使用eval這樣的東西。 set
會保持參數的完整性,而echo
以外的其他命令會和它們一起玩。請記住,您將失去對任何當前位置參數的引用。
set -- "a b" "c"
echo "[email protected]"
#a b c
echo $1
#a b
echo $2
#c
echo $ {X // \'/}; // a b c –