forループ範囲のワイルドカード拡張の問題

forループ範囲のワイルドカード拡張の問題

私が作成したbashスクリプトに問題があります。 forループ内ですべてのパラメータを繰り返して、後で「eval」コマンドに入力する文字列変数を設定します。

    for arg in "$*"
    do
        if [ $arg != $lastArg ]; then
            findTarget+="-name $arg -o "
        else
            findTarget=$(echo $findTarget | sed 's/-o$//')
            break
        fi
    done

問題は「$ *」で発生します。たとえば、パラメータに「* .c」と入力し、現在のフォルダにそのパターンと一致するファイルが含まれている場合、パラメータはそのファイル*.cに展開されます。私はこれをしたくありません。findTargetと接続しようとして-name *.c -oいます。 evalを使用し、引用符なしでは効果がないようです。これを行う方法を知っていますか(可能であれば簡単に)?注:パラメーターの総数は異なる場合があります。

以下は、スクリプトを実行する方法の例です。

$ trouver.bash *.c *.f90 someString

私のforループが終わったら、変数はfindTarget次のようになります。-name *.c -o -name *.f90

*.c*.f90現在のフォルダ内のファイルと一致する場合、または一致する場合は効果がありません。

ベストアンサー1

位置パラメータを繰り返す構文はfor arg do別々です。"$*"は最初の文字と位置引数を連結したものなので、1つの$IFS要素だけを繰り返すことになります。

また、コマンドのパラメータリストを作成するには、find文字列ではなく配列が必要です。そして変数を引用することを忘れないでください!

だから:

findTarget=()
or=()
for arg
do
    [ "$arg" = "$lastArg" ] && break
    findTarget+=("${or[@]}" -name "$arg")
    or=(-o)
done

find . \( "${findTarget[@]}" \)

スクリプトを呼び出すときに必要なことに注意してください。引用する...mode*.cそれ以外の場合は、スクリプトに渡される前にシェルによって拡張されます。

trouver.bash '*.c' '*.f90' someString

対話型シェルがある場合は、zshワイルドカードを無効にしてコマンドのエイリアスを定義できます。

alias trouver.bash='noglob trouver.bash'

このようにして、次のことができます。

trouver.bash *.c *.f90 someString

この球体を拡張するシェルはありません*.c *.f90

おすすめ記事