拡張を防ぐ方法

拡張を防ぐ方法

私のマスクはスクリプトパラメータと検索ツールパラメータで構成されています。

$mopt=false
case $1 in
...
    -m|--mask-file)     
            if $mopt; then
                or="-o"
            fi       
            mask+=("$or -name $2 ")
            mopt=true
            shift 2;;
...


find . "${mask[@]}"
=>
+ find . '-name *.cpp -o -name *.txt'

拡張はありませんが、すべてのパラメータの周りにアポストロフィがあるため失敗します。 $ maskに引用符がある場合は展開してください。

引用符を追加すると、検索ツールのパラメータを生成することはすでに困難です。

$mask+=("$or -name \"$2\" ")
find . {$mask[@]}
=>
+ find . -name '"*.cpp"' -o -name '"*.txt"'

- 名前 ''*.cpp'' -o - 名前 '"*.txt"'

マスクの周りに二重引用符を使用して実行される検索ツールも失敗します。手動でスクリプトを作成する場合:

find . -name "${mask[0]}" -o -name "${mask[1]}"...

コマンドは正しく実行されますが、可変数のマスクを入力できるように、照会パラメーターの名前を自動的に作成する必要があります。それでは、スタックの順序を見つけて次のように入力する必要がありますか?

find . $mask ...

答え1

(「-o」)、「-name」、「$2」など、検索するパラメータを2つまたは3つにしたいので、次のようにします。

mopt=false
case $1 in
...
    -m|--mask-file)     
            "$mopt" || mask+=(-o)
            mask+=(-name "$2")
            mopt=true
            shift 2;;

find . "${mask[@]}"

関連情報