1

マウントされたディスクにバックアップを作成するスクリプトを作成しました/mount/data/が、他のフォルダをコピーしながらそのフォルダをコピーしたくありません。またproc、をコピーしたくありません。sys

for dir in `ls /`; do
if [ $dir != "mount" -o $dir != "proc" -o $dir != "sys" ]; then
   sh /home/bin/safecopy $dir
fi
done

ただし、条件は無視されます

$dir != "mount" -o $dir != "proc" -o $dir != "sys"

safecopyコピーしてみてくださいmountprocそしてsys...なぜですか?

しかし、私がこれを行うとき

for dir in `ls /`; do
    if [ $dir != "mount" ]; then
    if [ $dir != "proc" ]; then
    if [ $dir != "sys" ]; then
       sh /home/bin/safecopy $dir
    fi
    fi
    fi
done

できます!

4

1 に答える 1

5

Bash 以外のシェルで実行する必要があると仮定するとcase、パターン マッチングをサポートしているため ( とは異なり[)を使用することをお勧めします。

for dir in /*/; do
    case $dir in
        /mount/|/proc/|/sys/)
            :
            ;;
        *)
            /home/bin/safecopy "$dir"
            ;;
    esac
done

特に Bash の場合は、次を使用できます。

shopt -s extglob
for dir in /!(mount|proc|sys)/; do
    /home/bin/safecopy "$dir"
done
  • 繰り返したりls、スクリプトで使用したりしないでください。
  • コマンド置換出力を単語分割しないでください。それらを引用してください。
  • バッククォートを使用しないでください"$(cmd)"
  • 従来のコマンド ( ) を使用する場合は、-aまたはを使用しないでください。[ テスト ] を使用 || [ テスト ] ...-otest[
  • 引用符を使用してください!それらはいくつかの重要な場所で行方不明になっています。
  • safecopy特別な引数が必要ない場合は、" " を "sh" で呼び出す必要はありませんsh。スクリプトにシバンを追加して、他のコマンドと同じように呼び出します。ライブラリの場合は、ソースとしてその関数を直接使用します。
于 2012-04-19T19:05:40.013 に答える