配列と文字列検索コマンドの使用

配列と文字列検索コマンドの使用

このスクリプトが機能するのはなぜですか?

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"

関連情報