我正在使用 bash 并嘗試使用字串變數將帶引號的引數傳遞給函式,但它失敗了。
myfunc() {
for myarg in "${@}"
do
echo ">$myarg<"
done
}
echo "prints three things"
myfunc foo bar "blah blah"
echo "uugh this prints four... why?!?!?"
myvar="foo bar \"blah blah\""
myfunc $myvar
產生這個:
prints three things
>foo<
>bar<
>blah blah<
uugh this prints four... why?!?!?
>foo<
>bar<
>"blah<
>blah"<
我正在構建引數串列,這就是我需要一個字串的原因。另外,我堅持使用 bash 4.2 版本。有沒有辦法讓第二次呼叫函式的行為與第一次呼叫相同?
注意:myvar正在從文本檔案中讀取,所以我需要它作為字串。
uj5u.com熱心網友回復:
使用陣列作為引數。
myvar=(foo bar "blah blah")
myfunc "${myvar[@]}"
您依賴于使用不帶引號的變數進行分詞,如果引數/strings 不包含空格或換行符或 shell 的特殊字符,那應該沒問題。
uj5u.com熱心網友回復:
另一種選擇是使用零分隔引數,xargs如下所示:
myfunc() {
echo -en $myvar | xargs -I{} -0 echo ">"{}"<"
}
echo "uugh this prints four... why?!?!?"
myvar="foo\0bar\0blah blah\0"
myfunc $myvar
uj5u.com熱心網友回復:
我想我想出了我自己的問題。該eval命令可能會以最少的麻煩解決這個問題:
echo "uugh this prints four... why?!?!?"
myvar="foo bar \"blah blah\""
myfunc "$myvar"
eval myfunc $myvar
uj5u.com熱心網友回復:
使用$myvar,變數的內容在空格上被拆分(這稱為分詞)。這會產生四個單詞foo,bar和。"blahblah"
當然,在實際應用程式中,您會創建myvar一個陣列,其中每個元素都包含您需要傳遞的字串。
例如:
myvar=(foo bar "\"blah blah\"" "baz boom") # 4 elements
或任何你喜歡的。
然后您將擴展陣列
myfunc "${myvar[@]}"
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/521897.html
標籤:细绳重击引用
