如何编写具有多个条件的 if 语句

如何编写具有多个条件的 if 语句
for filename in *
do
    if [ "$filename" -ne even ] && [ "$filename" -ne odd ]
    then
        echo "$filename"
    fi
done

上面是一个简单的shell脚本,它检查当前存储库中的文件并输出名称不是“偶数”和“奇数”的文件

行不通

答案1

比较运算符-ne是一个算术测试运算符,即它仅比较整数:

i=7

if [ "$i" -ne 6 ] && [ "$i" -ne 8 ]; then
   echo 'i is neither 6 nor 8'
fi

比较字符串对于不平等,请使用!=

if [ "$filename" != 'even' ] && [ "$filename" != 'odd' ]; then
    printf '"%s" is neither of the strings "even" or "odd"\n' "$filename"
fi

或者,使用case

case "$filename" in
    even|odd)
        # the filename is "even" or "odd"
        ;;
           *)
        # the filename is neither "even" nor "odd"
        printf '%s\n' "$filename"
esac

另请注意,它将*匹配当前目录中的任何名称,而不仅仅是常规文件的名称。为了确保您只处理循环中的常规文件,请使用

for name in *; do
    if [ ! -f "$name" ] || [ -L "$name" ]; then continue; fi

    # other code here using "$name"
done

continue语句跳至循环的下一次迭代。-f file检查常规的文件符号链接解析,所以如果我们想要类型的文件符号链接为了无论​​它们是否指向常规文件也被排除,我们还需要额外的|| [ -L "$name" ].

答案2

将行更改if为:

if [ "$filename" != even ] && [ "$filename" != odd ]

bashshell 中,整个脚本 (IEfordone包括),可以简化为:

GLOBIGNORE=even:odd ; printf "%s\n" *

另一种bash方法:

shopt -s extglob  # only needs to be done once, if not set already.
printf "%s\n" !(odd|even)

答案3

或者一对带有 -a 的括号

for filename in *
do
     if [ "$filename" != even -a "$filename" != "odd" ]
     then
         echo "$filename"
     fi
done

或者

for filename in * 
do 
    case "$filename" in  
        (even|odd) ;; 
            *) echo "$filename" ;; 
    esac
done

答案4

find -maxdepth 1 -not -name even -not -name odd 

可能是最短的解决方案,尽管有冗长的“-maxdepth 1”,但在目录叶子中,您可以省略它。

为每个文件调用一个程序非常简单:

find -maxdepth 1 -not -name even -not -name odd -exec wc {} ";" 

(如 wc 所示,它需要一个文件名,其中使用了花括号。此处依赖于 GNU-find。)

相关内容