Bash

使用 Bash 變數將一組參數傳遞給程序

  • October 2, 2021

我試圖通過在 bash 變數中放置重複參數來清理我的 shell 腳本。

我知道的最好的方法是將它放在一個數組中並傳遞它……但這似乎不起作用。如何將所有參數儲存在變數中?

這不起作用:

TESTP=( "-path" "\"./var/*\"")
echo ${TESTP[@]}
# Results in: -path "./var/*"
find ${TESTP[@]}
# Returns no results.

Whilefind -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[@]}首先擴展為數組元素 ( -pathand "./var/*"),然後每個都受 split+glob 運算符的約束(因為您忘記引用它了),因此使用預設值 時$IFS,它們不會被拆分,而是因為第二個包含一個萬用字元,它​​可以擴展為名稱以目錄結尾""./var文件。

很可能沒有".目錄,所以兩個參數都保留原樣並傳遞給find. 那將與

find -path '"./var/*"'

即在目錄下查找以字元"./var結尾的文件。"

引用自:https://unix.stackexchange.com/questions/241863