質問
私は次のスクリプトを持っている。
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
所属していません StackOverflow