bashscript mulitiple条件

Elt*_*ooo 1 linux bash shell

我写了一个脚本,它备份到已装载的磁盘/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
Run Code Online (Sandbox Code Playgroud)

但条件被忽略了

$dir != "mount" -o $dir != "proc" -o $dir != "sys"
Run Code Online (Sandbox Code Playgroud)

safecopy尝试复制mount,procsys...为什么?

但是当我这样做的时候

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
Run Code Online (Sandbox Code Playgroud)

有用!

orm*_*aaj 5

假设需要在Bash以外的shell上运行是一种好方法case,因为它支持模式匹配(不像[):

for dir in /*/; do
    case $dir in
        /mount/|/proc/|/sys/)
            :
            ;;
        *)
            /home/bin/safecopy "$dir"
            ;;
    esac
done
Run Code Online (Sandbox Code Playgroud)

对于Bash,您可以使用:

shopt -s extglob
for dir in /!(mount|proc|sys)/; do
    /home/bin/safecopy "$dir"
done
Run Code Online (Sandbox Code Playgroud)
  • 永远不要迭代,甚至ls在脚本中使用.
  • 引用它们,永远不要分词命令替换输出.
  • 永远不要使用反引号,使用"$(cmd)".
  • 切勿使用-a-o使用经典test命令([).使用[test] || [测试] ......
  • 使用报价!他们在几个重要的地方失踪了.
  • safecopy如果不需要特殊参数,则不必使用"sh" 调用" " sh.在脚本中添加一个shebang并像任何其他命令一样调用它,或者如果它是一个库,请直接使用它并使用它的函数.

  • 与我一样"永不",至少在编程方面,这些规则绝对值得记住.+1 (4认同)