首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bashscript多重条件

bashscript多重条件
EN

Stack Overflow用户
提问于 2012-04-20 00:07:33
回答 1查看 134关注 0票数 1

我写了一个脚本,在/mount/data/的挂载磁盘上进行备份,我不想在复制其他文件夹的同时复制该文件夹,我也不想复制procsys

代码语言:javascript
复制
for dir in `ls /`; do
if [ $dir != "mount" -o $dir != "proc" -o $dir != "sys" ]; then
   sh /home/bin/safecopy $dir
fi
done

但是条件被忽略。

代码语言:javascript
复制
$dir != "mount" -o $dir != "proc" -o $dir != "sys"

safecopy试图复制mountprocsys ...为什么?

但是当我这样做的时候

代码语言:javascript
复制
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

它起作用了!

EN

回答 1

Stack Overflow用户

发布于 2012-04-20 03:05:40

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

代码语言:javascript
复制
for dir in /*/; do
    case $dir in
        /mount/|/proc/|/sys/)
            :
            ;;
        *)
            /home/bin/safecopy "$dir"
            ;;
    esac
done

具体来说,对于Bash,您可以使用:

代码语言:javascript
复制
shopt -s extglob
for dir in /!(mount|proc|sys)/; do
    /home/bin/safecopy "$dir"
done

  • 从不迭代,甚至在脚本中使用ls
  • 从不用单词拆分命令替换输出,请将它们引起来。
  • 从不使用反引号,在使用经典的<

>d16>命令(<>d17>)时,请使用-a-o。使用test || TEST...

  • 使用引号!
  • 如果不需要sh的特殊参数,你不应该用"sh“来调用"safecopy”。将shebang添加到脚本中,并像调用任何其他命令一样调用它,或者如果它是一个库,则将其源代码编写并直接使用其函数。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10232196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档