私の正規表現がbash "if"で動作しないのはなぜですか? [コピー]

私の正規表現がbash "if"で動作しないのはなぜですか? [コピー]

これは私のコードです。

if [ -f /Applications/xml[0-9].pl ]

また、二重括弧を使ってみましたが、-f =~どちらも機能しないようです。

最初は正規表現に問題があると思いましたが、これを試してみました。

echo h1 | sed 's/h[0-9]/h/'

これは効果がありました。私がここで何を間違っているのか?

答え1

ファイルをテストするために、このような正規表現やglobを使用することはできません。ファイルを繰り返す必要があります。

for file in /Applications/xml[0-9].pl; do if [ -f "$file" ]; then ...

答え2

bash は条件を評価する前に正規表現を拡張します。ディレクトリに次の3つのファイルが含まれている場合

/Applications/xml0.pl
/Applications/xml1.pl
/Applications/xml2.pl

あなたのif声明は次のとおりです

if [ -f /Applications/xml0.pl /Applications/xml1.pl /Applications/xml2.pl ]]

これは文法的に正しくありません。次のコマンドを使用してファイルが存在することを確認するには、ファイル名を完全に指定する必要があります。

for file in /Applications/xml[0-9].pl
do
    if [ -f ${file} ]

または、可能であれば、そのfindコマンドを使用してファイルに対して必要な操作を実行します。

関連情報