3

次のスクリプトがあります

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

すべてがエコーまで機能し、スクリプトが終了すると、終了せずに続行します。何か案は。

ありがとう

4

4 に答える 4

5

そのバックスラッシュは必要ありません-これはCシェルではありません。

問題は、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$1」ではなく「cat"$@"」)を処理する必要がある場合は、さらに多くの作業を行う必要があります。

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 $'も許可する必要がある場合は、プレーンgrepの代わりにegrepを使用してください。)

于 2010-02-06T02:30:08.847 に答える
1

テキストを小文字のテキストから大文字のテキストに変換していますが、小文字に対してテストしているため、出口に到達することはありません。

于 2010-02-06T02:45:35.483 に答える
1

すべての行を大文字に変換したいので、このようにすることができます

#!/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
于 2010-02-06T02:47:27.483 に答える
0

shopt -s nocasematchテストの上に追加することで、条件文で大文字と小文字を区別しないようにすることができます。大文字と小文字を区別するように設定するには: shopt -u nocasematch.

于 2010-02-06T02:45:18.657 に答える