gpt4 book ai didi

linux - bash 脚本多重条件

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:51 24 4
gpt4 key购买 nike

我写了一个脚本,它在 /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 尝试复制 mountprocsys ... 为什么?

但是当我这样做的时候

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,因为它支持模式匹配(与 [ 不同):

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)"
  • 在使用经典的 test 命令 ([) 时,切勿使用 -a-o。使用 [测试] || [测试] ...
  • 使用引号!他们在几个重要的地方失踪了。
  • 如果不需要sh 的特殊参数,则不必使用“sh”调用“safecopy”。向脚本添加一个 shebang 并像调用任何其他命令一样调用它,或者如果它是一个库,则获取它并直接使用它的功能。

关于linux - bash 脚本多重条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10232196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com