Bash
使用 Bash 變數將一組參數傳遞給程序
我試圖通過在 bash 變數中放置重複參數來清理我的 shell 腳本。
我知道的最好的方法是將它放在一個數組中並傳遞它……但這似乎不起作用。如何將所有參數儲存在變數中?
這不起作用:
TESTP=( "-path" "\"./var/*\"") echo ${TESTP[@]} # Results in: -path "./var/*" find ${TESTP[@]} # Returns no results.
While
find -path "./var/*"
確實返回 var 下的所有文件。
您要麼希望將這些數組元素作為參數傳遞給
find
:TESTP=(-path './var/*') find . "${TESTP[@]}"
或者建構一個shell命令行並要求 shell 解釋它(以及其中的引號):
TESTP='-path "./var/*"' eval "find . $TESTP"
或者,您可以在標量變數上使用 split+glob 運算符(通過在問題中未引用變數來不當使用該運算符):
TESTP='-path,./var/*' set -f # no glob IFS=, # split on , find . $TESTP
在你的,
TESTP=( "-path" "\"./var/*\"") find ${TESTP[@]}
${TESTP[@]}
首先擴展為數組元素 (-path
and"./var/*"
),然後每個都受 split+glob 運算符的約束(因為您忘記引用它了),因此使用預設值 時$IFS
,它們不會被拆分,而是因為第二個包含一個萬用字元,它可以擴展為名稱以目錄結尾"
的"./var
文件。很可能沒有
".
目錄,所以兩個參數都保留原樣並傳遞給find
. 那將與find -path '"./var/*"'
即在目錄下查找以字元
"./var
結尾的文件。"