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
。请使用[test]|[test]-o
- 使用引号!它们在几个重要的地方丢失了
- 如果不需要
的特殊参数,则不必用“sh”调用“sh
”。向脚本添加一个shebang,并像调用任何其他命令一样调用它,或者如果它是一个库,则直接使用它的函数safecopy
- 假设需要在除Bash以外的shell上运行,一个好方法是使用
case
,因为它支持模式匹配(与[
)不同:
特别是对于Bash,您可以使用:
shopt -s extglob
for dir in /!(mount|proc|sys)/; do
/home/bin/safecopy "$dir"
done
- 不要在脚本中迭代,甚至不要使用
ls
- 永远不要使用单词分割命令替换输出,引用它们
- 切勿使用反勾号,请使用
“$(cmd)”
- 使用经典的
测试
命令(
)时,切勿使用[
或-a
。请使用[test]|[test]-o
- 使用引号!它们在几个重要的地方丢失了
- 如果不需要
的特殊参数,则不必用“sh”调用“sh
”。向脚本添加一个shebang,并像调用任何其他命令一样调用它,或者如果它是一个库,则直接使用它的函数safecopy
或而不是和。这最好用一个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实际上没有错的东西,所以你会被拒绝。:)我只是想警告大家。