次のスクリプトを使用してディレクトリ内の特定のファイルを削除するために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
詳細な説明については、お読みください。ヘビーヒートトラップ。