-name
端末に「デフォルト」という名前を明示的に入力しながら、変数に保存して呼び出す配列の任意の数の文字列からコマンドの複合主キーを生成しようとしています。パラメータ拡張No.実行前に拡張が行われるため、拡張変数の参照に関する問題と考えられます。find
\( -name ${a[0]} -or -name ${a[1]} -or -name ${a[2]} ... \)
find
以下は、文字通り入力されるか、変数から呼び出されるn = 2名の最小例です。ただパイプで接続することもできますが、この場合はgrep
すべての作業を行う方が良いです。find
$ ls
a1 a2 b1 b2 c1 c2
$ find . \( -name a\* -or -name b\* \)
./a1
./a2
./b1
./b2
$ names="\( -name a\* -or -name b\* \)"
$ printf "%s\n" "$names"
\( -name a\* -or -name b\* \)
$ find . $(printf "%q" "$names")
find: -name\: unknown primary or operator
$ find . $(printf "%s" "$names")
find: \): unknown primary or operator
$ find . $names
find: \): unknown primary or operator
$ find . "$names"
find: \( -name a\* -or -name b\* \): No such file or directory
答え1
各-name
、各-or
、各括弧、および各パターンは別々のパラメータでなければなりませんfind
。引数をスペースで連結しないでください。そこから引数リストに戻ることはできません。引数を区切るために使用されるスペースと引数の一部をどのように知ることができますか?また、見ることができますスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?
シェルが配列(ksh、bash、zsh)をサポートしている場合は、引数リストを配列に保存します。
names=(\( -name a\* -or -name b\* \))
…
find "${names[@]}"
$1
シェルが配列をサポートしていない場合は、位置パラメータ(、、$2
...を介してアクセスできるパラメータ)でリストを設定できます。明らかな制限は、位置パラメータを他の目的に使用できないことです。
set -- \( -name a\* -or -name b\* \)
…
find "$@"