[英]Bourne Shell: how to terminate when inner shell command returns nonzero exit code?
[英]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.