質問

私は次のスクリプトを持っている。

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シェルではありません。

問題は、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
あなたが(代わりに '猫$ 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
「:バーfooが」で発見された場合に

これは、実施例1になる「しばらく」ループの終了ステータスである「猫」と「しばらく」からなるパイプラインの終了ステータスをチェック行の先頭ます。

もちろん、のようなものを検出する他の方法は、あります

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

このループのバージョンよりもはるかに少ないのコマンドを実行します。 (あなたができるようにする必要がある場合。:だけでなく '^ fooのバー$'、代わりに無地のgrepのegrepを使用します)。

他のヒント

あなたは小文字のテキストから大文字のテキストにテキストを翻訳するが、その後、下部ケースに対してテストするので、あなたは、出口に到達することはありませんしています。

あなたはライン毎に大文字に変換するために、あなたはこのようにそれを行うことができます。

#!/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

ORあなただけの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帰属
所属していません StackOverflow
scroll top