簡體   English   中英

Bourne Shell出口將不起作用

[英]Bourne Shell exit will not work

我有以下腳本

cat $1 | while read line
do
    line=`echo $line | tr "[:lower:]" "[:upper:]"`

    if [ "`echo $line | cut -f1 -d:`" = "foo" ] && \
       [ "`echo $line | cut -f2 -d:`" = "bar" ]; then
        echo 'exsist'
        exit 1;
    fi
done

一切都會回聲,然后當腳本命中退出時,它不會繼續運行。 有任何想法嗎。

謝謝

您不需要反斜杠-這不是C shell。

問題是while循環位於子外殼中,該子外殼會退出,但是由於它是作為子外殼運行的,因此主腳本會繼續。

在上下文中,最簡單的解決方法可能是:

while read line
do
    line=`echo $line | tr "[:lower:]" "[:upper:]"`
    if [ "`echo $line | cut -f1 -d:`" = "foo" ] &&
       [ "`echo $line | cut -f2 -d:`" = "bar" ]; then
        echo 'exist'
        exit 1
    fi
done < $1

如果您必須處理多個文件('cat“ $ @”“而不是'cat $ 1'),那么您就必須更加努力地工作:

cat "$@" |
while read line
do
    line=`echo $line | tr "[:lower:]" "[:upper:]"`
    if [ "`echo $line | cut -f1 -d:`" = "foo" ] &&
       [ "`echo $line | cut -f2 -d:`" = "bar" ]; then
        echo 'exist'
        exit 1
    fi
done
[ $? != 0 ] && exit 1

這將檢查由“ cat”和“ while”組成的管道的退出狀態,這是“ while”循環的退出狀態,在示例中,如果在a的開頭找到“ foo:bar”,則該退出狀態為1。線。

當然,還有其他檢測方法,例如:

grep -s -q "^foo:bar:" "$@" && exit 1

它執行的命令比循環版本少得多。 (如果還需要允許使用'^ foo:bar $',請使用egrep代替普通的grep。)

您正在將文本從小寫文本轉換為大寫文本,然后再針對小寫進行測試,因此您永遠都不會到達出口。

由於您想將每一行都轉換為大寫,因此可以這樣做

#!/bin/sh

tr '[:lower:]' '[:upper:]' < file | while IFS=":" read -r a b c
do
    case "$a $b" in
        "FOO BAR" ) echo "exist";exit;;
        *) echo "$a $b";;
    esac
done

或者,您也可以只用awk(對於Solaris為nawk)來完成

nawk -F":" '
topper($1)=="FOO" && topper($2)=="BAR"{
    print "exist"
    exit
}
{
    print topper($0)
}
' file

通過在測試上方添加shopt -s nocasematch ,可以使條件條件不區分大小寫。 要將情況設置為區分大小寫: shopt -u nocasematch

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM