bash脚本多个条件

时间:2012-04-19 16:07:33

标签: linux bash shell

我写了一个脚本,它在/mount/data/中备份到已安装的磁盘,我不想复制该文件夹,同时复制其他文件夹,我不想复制proc,{{1也是

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" 尝试复制safecopymountproc ...为什么?

但是当我这样做时

sys

它有效!

1 个答案:

答案 0 :(得分: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
  • 从不使用word-split命令替换输出,引用它们。
  • 切勿使用反引号,请使用"$(cmd)"
  • 使用经典-a命令(-o)时,切勿使用test[。使用[test] || [测试] ......
  • 使用引号!他们在几个重要的地方失踪了。
  • 如果不需要safecopy的特殊参数,则不必使用“sh”调用“sh”。在脚本中添加一个shebang并像任何其他命令一样调用它,或者如果它是一个库,请直接使用它并直接使用它的函数。