Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bashscript多重条件_Linux_Bash_Shell - Fatal编程技术网

Linux bashscript多重条件

Linux bashscript多重条件,linux,bash,shell,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 但这个条件被忽略了 $dir != "mount" -o $dir != "proc" -o $dir != "sys

我编写了一个脚本,将备份到
/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
尝试复制
mount
proc
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

它起作用了

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

特别是对于Bash,您可以使用:

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

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

      特别是对于Bash,您可以使用:

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

      仔细查看您的情况:您使用的是
      而不是
      。这最好用一个case编码:case dir in mount | proc | sys);*)sh/home/bin/safecopy$dir;;Esacy您也可以这样做:test$dir=mount&&continue;test$dir=proc&&continue…为什么
      在`ls/`
      中为dirode>工作正常并且没有严重损坏?如果您的脚本中不需要POSIX兼容性,您可以通过将
      [[
      ]
      构造开始使用。人们通常会发现它们更直观。阅读所有内容:仔细查看您的情况:您使用的是
      而不是
      。这最好用一个case编码:case dir in mount | proc | sys);*)sh/home/bin/safecopy$dir;;Esacy您也可以这样做:test$dir=mount&continue;test$dir=proc&&continue…为什么
      for dir in`ls/`
      for dir in/*
      工作并且没有严重损坏?如果您的脚本中不需要POSIX兼容性,您可以通过将
      [[
      ]放在
      constructs投入使用。人们通常会发现它们更直观。阅读所有关于它的内容:而不是“从不”就我而言,至少在编程方面,这些规则绝对值得记住+1@DanielKamilKozar当然是的,尽管shell语法相当复杂——如果人们犯了这样的基本错误,那么最好还是坚持“规则”。这些特别的指导原则是非常一致的。+1.大师可以随意忽略他喜欢的任何规则,新手应该虔诚地遵守它们。-1如果没有实际工作--
      /*/
      将扩展到例如
      /mount/
      ,而不是例如
      mount
      ,那么
      mount | proc | sys
      需要是
      /mount//proc>/|/sys/)
      ——但如果你解决了这个问题,我会+1你的答案,并删除我的。(我通常不会-1来纠正这么容易的问题,但一个不合理的-1应该得到另一个。))@ruakh很好,patterns!=globs-我通常不会使用第一种解决方案,也不会使用-1实际上没有错的东西,所以你会被拒绝。:)我只是想警告大家。而不是“从不”就我而言,至少在编程方面,这些规则绝对值得记住+1@DanielKamilKozar当然是的,尽管shell语法相当复杂——如果人们犯了这样的基本错误,那么最好还是坚持“规则”。这些特别的指导原则是非常一致的。+1.大师可以随意忽略他喜欢的任何规则,新手应该虔诚地遵守它们。-1如果没有实际工作--
      /*/
      将扩展到例如
      /mount/
      ,而不是例如
      mount
      ,那么
      mount | proc | sys
      需要是
      /mount//proc>/|/sys/)
      ——但如果你解决了这个问题,我会+1你的答案,并删除我的。(我通常不会-1来纠正这么容易的问题,但一个不合理的-1应该得到另一个。))@ruakh观点很好,patterns!=globs-我通常不会使用第一种解决方案,也不会使用-1实际上没有错的东西,所以你会被拒绝。:)我只是想警告大家。