1

我编写了一个脚本,该脚本将备份到已安装的磁盘中/mount/data/,我不想在复制其他文件夹时复制该文件夹,我procsys不想复制

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 以外的 shell 上运行,一个好方法是使用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-o在使用经典test命令 ( [) 时使用。使用 [ 测试 ] || [ 测试 ] ...
  • 使用引号!他们在几个重要的地方失踪了。
  • safecopy如果不需要特殊参数,则不必用“sh”调用“ ” sh。向脚本添加一个 shebang 并像任何其他命令一样调用它,或者如果它是一个库,则获取它并直接使用它的函数。
于 2012-04-19T19:05:40.013 回答