私のBashスクリプトには次の行があります。
mv -f $HOME_DIR/$dir $HOME_SAVE/BACKUP
問題は、ディレクトリ$dir
が空のとき($dir
ディレクトリなし)mv
コマンドがディレクトリを移動したことです$HOME_DIR
。$dir
ディレクトリを移動したいです。
これをどのように避けることができますか?
私はこれを使うことができます:
ls $HOME_DIR | wc -l
# and verify if the number is -gt 1
しかし、これはエレガントな解決策ではありません。
ベストアンサー1
以下を使用する必要があります。
mv -f -- "$HOME_DIR/${dir:?}" "$HOME_SAVE/BACKUP/"
$dir
値が空の場合、拡張は失敗し、スクリプトは終了し、stderrにエラーメッセージが表示されます。
印刷するメッセージを指定することもできます。たとえば、次のようになります。
mv -f -- "$HOME_DIR/${dir:?\$dir is UNSET or NULL!}" "$HOME_SAVE/BACKUP/"
代わりに、 - 最終的に - 設定されていない、空の、または同様のフォームを使用して設定され、空でない場合にのみ適用されるデフォルト値および/または代替値を指定できます$dir
。上記と下のすべての例は、いくつかの標準POSIX指定パラメータ拡張形式を示しています。:-
:+
以下の例で$dir
設定され、空でない場合、最初の部分はソースディレクトリとして評価されます。それ以外の場合は何も評価されず、2番目の部分はその値がある場合はその値として評価されますが、そうでない場合は次のように評価されます。あなたのターゲットディレクトリ。mv
1 番目と 2 番目の引数の名前が同じパス名で指定された場合、指定は失敗するため、何も移動されません。
mv -f -- "${dir:+$HOME_DIR/}${dir:-$HOME_SAVE/BACKUP/}" "$HOME_SAVE/BACKUP/" 2>/dev/null
私の考えではこれは少し過剰かもしれません。
mv -f -- "$HOME_DIR/$dir" ${dir:+"$HOME_SAVE/BACKUP/"} 2>/dev/null
...同じでなければなりません。mv
何も移動できません。どこでも。 POSIX互換シェルでは、引用符は中括弧内でも拡張を保護できます。これは値拡張では{}
ないからです。$dir
${dir:+word}
言葉価値が拡張されました。設定されていないか空白の場合、中${dir}
かっこ内に配置すると、拡張は何も評価されず、空の文字列も評価されません。おそらく重要ではないでしょう。空のファイル名はほとんどどこでも有効ではないと確信しています。しかし、これが私が一般的に使用する方法です。ただし、これは安全ではありません。この場合、引用符のない拡張または引用符付きの拡張を${dir:-"word"}
受け取ります。${dir}
word
nullの場合にのみインタラクティブオプションを呼び出すこともできます-i
。たとえば、次のようになります。mv
$dir
mv "-i${dir:+f}" -- "$HOME_DIR/$dir" "$HOME_SAVE/BACKUP/" </dev/tty
...それで、少なくとも誤ってファイルを上書きしないようにすることができます。.../サポート誰も先に押さなかったワイ (何の関係なのか)ターミナルから。