Unixシェルスクリプトの変数内に隠された特殊文字をエスケープする方法

Unixシェルスクリプトの変数内に隠された特殊文字をエスケープする方法

次のスクリプトを使用してディレクトリ内の特定のファイルを削除するためにbashシェルスクリプトを使用しています。

#!/bin/bash
path=$1
for filename in $path/*; do
    if [ -d "$filename" ]; then
        echo $filename
        rm $filename/*statssys*
    fi
done

つまり、指定されたパス内の1レベルの深いディレクトリをすべて繰り返し、statssysその名前に含まれるすべてのファイルを削除します。問題は、検索されたファイルパスにまたは$filenameなどの数字の終わりが含まれていることです。角かっこはコマンドが実行される前にエスケープする必要がありますが、 $filename 変数に隠されているので、どうすればよいかわかりません。file_path[8]file_path[9]rm

助けてくれてありがとう。

答え1

Bashスクリプトには、一般的なプログラマーが落ちるトラップがたくさんあります。

1つの規則は各引数を二重引用符で拡張することです。これが主な問題です。その他のルールには以下が含まれます。echo任意のデータ出力を防止そして--オプションを他のパラメータと区別するために使用されます。開始されますが、-オプションと見なされるべきではない引数を防ぎます。

あなたの例では、スクリプトを次のように変更できます。

#!/bin/bash --
path="$1"
for filename in "$path"/*; do
    if [ -d "$filename" ]; then
        printf '%s\n' "$filename"
        rm -- "$filename"/*statssys*
    fi
done

詳細な説明については、お読みください。ヘビーヒートトラップ

関連情報