【问题标题】:Bourne Shell exit will not workBourne Shell 退出将不起作用
【发布时间】:2010-02-06 02:22:31
【问题描述】:

我有以下脚本

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

一切都可以回显,然后当脚本退出时,它不会并继续运行。任何想法。

谢谢

【问题讨论】:

  • UUOC: 代替 cat $1 | while ... 你可以做 while ... done
  • -1 用于 UUOC 并为每一行使用外部命令。

标签: shell exit sh


【解决方案1】:

你不需要那个反斜杠 - 这不是 C shell。

问题是while循环在子shell中,它退出了,但是因为它是作为子shell运行的,所以主脚本继续运行。

在上下文中,最简单的解决方法可能是:

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'循环的退出状态,如果在示例中找到'foo:bar',则该状态将为1一行的开头。

当然,还有其他方法可以检测到,比如:

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

这比循环版本执行的命令少得多。 (如果您还需要允许使用 '^foo:bar$',请使用 egrep 而不是普通的 grep。)

【讨论】:

  • 没那么难;而读线;做 ...;完成
【解决方案2】:

您正在将文本从小写文本翻译成大写文本,然后针对小写进行测试,因此您永远不会退出。

【讨论】:

    【解决方案3】:

    由于您想将每一行都转换为大写,您可以这样做

    #!/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(nawk for Solaris)

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

    【讨论】:

      【解决方案4】:

      您可以通过在测试上方添加shopt -s nocasematch 使您的条件不区分大小写。要将内容重新设置为区分大小写:shopt -u nocasematch

      【讨论】:

      • 假设bourne标签真的意味着传统的bourne shell,据我的记忆,不要认为有nocasematch选项。如果我错了,请纠正我。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2014-10-09
      • 1970-01-01
      • 2011-01-13
      相关资源
      最近更新 更多