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

Tin*_*ler 5 shell

for filename in *
do
    if [ "$filename" -ne even ] && [ "$filename" -ne odd ]
    then
        echo "$filename"
    fi
done
Run Code Online (Sandbox Code Playgroud)

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

行不通

Kus*_*nda 6

比较运算符-ne算术运算符,即它只比较整数:

i=7

if [ "$i" -ne 6 ] && [ "$i" -ne 8 ]; then
   echo 'i is neither 6 nor 8'
fi
Run Code Online (Sandbox Code Playgroud)

要比较字符串的不等式,请使用!=

if [ "$filename" != 'even' ] && [ "$filename" != 'odd' ]; then
    printf '%s\n' "$filename"
fi
Run Code Online (Sandbox Code Playgroud)

或者,使用case

case "$filename" in
    even|odd) ;;
           *) printf '%s\n' "$filename"
esac
Run Code Online (Sandbox Code Playgroud)

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

for name in *; do
    test -f "$name" || continue

    # other code here using "$name"
done
Run Code Online (Sandbox Code Playgroud)

test -f "$name" 可以替换为

if [ ! -f "$name" ]; then
    continue
fi
Run Code Online (Sandbox Code Playgroud)

要不就

[ ! -f "$name" ] && continue
Run Code Online (Sandbox Code Playgroud)

或者

[ -f "$name" ] || continue
Run Code Online (Sandbox Code Playgroud)

continue语句跳到循环的下一次迭代。


agc*_*agc 5

将行更改if为:

if [ "$filename" != even ] && [ "$filename" != odd ]
Run Code Online (Sandbox Code Playgroud)

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

GLOBIGNORE=even:odd ; printf "%s\n" *
Run Code Online (Sandbox Code Playgroud)

另一种bash方法:

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