わかりました。このコードがあります。
dirname=
if [ -d $dirname ];
then
cd $dirname && rm *
fi
ご覧のように、この空の変数があるので、単一の角かっこを含む空の変数を使用すると、すべてのユーザーのホームディレクトリファイルが削除される理由がわかります。
角かっこを使用すると、ユーザーのホームディレクトリファイルは削除されません。
このように
dirname=
if [[ -d $dirname ]];
then
cd $dirname && rm *
fi
単一の角かっこと二重角かっこを使用するときの構文の違いについて読みました。
なぜこれが起こるのかわかりますか?
ベストアンサー1
引数が渡されない場合は、cd
デフォルトディレクトリ(ほとんどの場合はユーザーのホームディレクトリ$HOME
)に変更されます。
-d
この質問の興味深い部分は、bashや組み込みtest
演算[
子に何も渡さないときにbashが0で終わるように見えることです(私の考えでは予想外のことです)。
変数を空白に設定すると、dirname
実際に次のコマンドが実行されます。
if [ -d ]; then
cd && rm *
fi
私にとっては、そのブロック内のコードがif
実行されることは驚くべきことですが、私のコンピュータでは実際に実行されていることを確認できます。上記の説明で説明したように、test
これは-d
演算子として解釈されず、空ではない文字列なので、単にゼロを返します。この動作を防止する1つの方法は、変数を引用符で囲むことです。
if [ -d "$dirname" ]; then
cd "$dirname" && rm *
fi
この場合、空の場合、ゼロ以外の終了コードを正しく計算する演算子を渡す$dirname
ため、ブロック内のコードは実行されません。""
-d