Bash変数を使用してパラメータセットをプログラムに渡す

Bash変数を使用してパラメータセットをプログラムに渡す

bash変数に重複したパラメータを入れてシェルスクリプトをクリーンアップしようとしています。

私が知っている最良の方法は、配列に入れて渡すことです。しかし、うまくいかないようです。すべてのパラメータを変数に保存するには?

これはうまくいきません:

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

whileはfind -path "./var/*"varの下のすべてのファイルを返します。

答え1

次の配列要素を引数として渡そうとしますfind

TESTP=(-path './var/*')
find . "${TESTP[@]}"

それとも新しく作ってください。シェルコマンドラインを入力し、シェルにそれを解釈するように依頼します(およびその中の引用符)。

TESTP='-path "./var/*"'
eval "find . $TESTP"

あるいは、スカラー変数に分割+glob演算子を使用することもできます(質問で変数を引用符で囲むことで演算子を不適切に使用する)。

TESTP='-path,./var/*'

set -f # no glob
IFS=,  # split on ,
find . $TESTP

あなたの、

TESTP=( "-path" "\"./var/*\"")
find ${TESTP[@]}

${TESTP[@]}まず、配列要素(および-pathに拡張され、名前がディレクトリで終わるファイルに拡張できます)。"./var/*"$IFS""./var

ディレクトリが存在しない可能性が高い".ため、両方のパラメータが保持されて渡されますfind

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

つまり、ディレクトリ内"./varの特定の文字で終わるファイルを見つけます"

関連情報