如果用OR循环

时间:2014-12-23 15:16:47

标签: shell if-statement

我在input.txt文件中有以下字符串。

Running
isn't running
is running
Stopped
stopped
Aborted
aborted

在这里我需要匹配除" Running"之外的所有内容。和"正在运行"。到目前为止,我已经在下面做了,但似乎是打印" Running"并且"正在运行"同样。可以帮一下吗?

exec < input.txt
while read line
do
    if [[ $line =~ [Aa]borted || [Ss]topped || isn*t ]]; then
        echo "$line"
    else
        echo "FINE"
    fi
done

2 个答案:

答案 0 :(得分:1)

为什么不使用grep?

grep -v "unning" < input.txt

为您提供所需的线条。

答案 1 :(得分:0)

grep -vE '\<(R|is r)unning\>' input.txt

\<\>标记是单词边界,因此您不会过滤掉“此运行”

在shell中

while IFS= read -r line; do
    case $line in
    *"Running"* | *"is running"*) echo FINE ;;
    *) echo "$line" ;;
    esac
done < input.txt

代码中存在问题:此行

[[ $line =~ [Aa]borted || [Ss]topped || isn*t ]]

等同于此

[[ $line =~ [Aa]borted ]] || [[ $line =~ [Ss]topped ]] || [[ $line =~ isn*t ]]

等同于此

[[ $line =~ [Aa]borted ]] || [[ -n "[Ss]topped" ]] || [[ -n "isn*t" ]]

因为“或”运算符||的优先级高于正则表达式匹配运算符=~

由于最后2个条件始终为真,因此每行都会通过。

另请注意,您正在使用带有正则表达式匹配运算符的glob模式,因此[[ $line =~ isn*t ]]isn't不匹配,它将与ist匹配中间为零或更多n。 (istisntisnnt等)

你打算写这个

[[ $line == [Aa]borted || $line == [Ss]topped || $line == isn*t ]]

这是用案例简明写的mote:

case $line in 
    [Aa]borted | [Ss]topped | isn*t) echo "$line" ;;
    *) echo FINE ;;
esac

这是我的答案的反面。