このスクリプトが機能するのはなぜですか?
str=( -name "*.conf" -o -name "test test" )
find ./ \( "${str[@]}" \)
そして、このスクリプトは機能しませんか?
str[0]="-name"
str[1]="\"*.conf\""
str[2]="-o"
str[3]="-name"
str[4]="\"test test\""
find ./ \( "${str[@]}" \)
エラーは次のとおりです。str[1]="\"*.conf\""
私は2番目のシナリオに興味があります。
答え1
これ:
str=( -name "*.conf" -o -name "test test" )
(通常)次のようになります。
str=( "-name" "*.conf" "-o" "-name" "test test" )
ほとんどの引用符は必要ないので省略されます。ファイル名を拡張するためのワイルドカードはなく、デフォルトのIFSにはこれらの要素のフィールド分割を引き起こす可能性のある空白文字がありません。
したがって、これに対応する内容は次のとおりです。
declare -a str
str[0]="-name"
str[1]="*.conf"
str[2]="-o"
str[3]="-name"
str[4]="test test"
または:
declare -a str
str[0]=-name
str[1]=*.conf # no filename expansion in variable assignment
str[2]=-o
str[3]=-name
str[4]="test test"