• ベストアンサー

シェルの変数の仕様

シェルで、次のようにコマンドを実行すると指定した拡張子のファイルだけ消せます。 # rm ./{*.csv,*.exe} rm: remove 通常の空ファイル `./test.csv'? rm: remove 通常の空ファイル `./test.exe'? しかし、パスを変数にするとなぜかうまくいきません。 # src_dir=. # file={*.csv,*.exe} # rm $src_dir/$file rm: cannot lstat `./{*.csv,*.exe}': そのようなファイルやディレクトリはありません 正しい使い方を教えてください。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

使っているシェルの名前を明示してくれないと回答不能。 >しかし、パスを変数にするとなぜかうまくいきません。 理由は以下の通り。 ・変数へ値を代入する場合、=の右辺は展開されない(書いた物がそのまま入る) ・変数から値を取り出す場合、特殊文字は展開されず、値がそのまま取り出される 何故もクソも無い。これは「常識」だぞ。 ># rm ./{*.csv,*.exe} って打ったら、シェルは「./{*.csv,*.exe}」の部分を展開する。展開したら、打ち込んだコマンドは rm ./test.csv' ./test.exe に変身する。なので、rmは >rm: remove 通常の空ファイル `./test.csv'? >rm: remove 通常の空ファイル `./test.exe'? を実行する。 ># src_dir=. src_dirの中身は「.」だ。 ># file={*.csv,*.exe} fileの中身は「{*.csv,*.exe}」だ。=の右辺は「そのまま入る」からな。 ># rm $src_dir/$file 変数の中身の値が「そのまま置き換わる」から rm ./{*.csv,*.exe} になる。なので >rm: cannot lstat `./{*.csv,*.exe}': そのようなファイルやディレクトリはありません が出て当たり前。 >正しい使い方を教えてください。 # src_dir=. # files=`echo $src_dir/{*.csv,*.exe}` # rm $files いきなり「rm」でやると、失敗した時に「ルートのファイルを消しちゃう」から # src_dir=. # files=`echo $src_dir/{*.csv,*.exe}` # echo $files みたいに、echoコマンドに置き換えて試せよ。間違っても「いきなりrmで実行」とかするなよ。

inshin
質問者

お礼

詳しい解説をありがとうございました。 この常識をしっかりと覚えておきます^^; 原因が分かったので、結局以下のように修正することにしました。 sh -l "rm ${src_dir}/${file}" どうもありがとうございました。

関連するQ&A

専門家に質問してみよう