سؤال
لدي البرنامج النصي التالي
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
كل شيء يعمل حتى صدى ثم عندما يضرب البرنامج النصي لا يذهب ويستمر في الذهاب. أيه أفكار.
شكرا
المحلول
لا تحتاج إلى عكس الخلفية - هذه ليست قذيفة ج.
المشكلة هي أن الحلقة أثناء وجودها في قذيفة فرعية، والتي تخطئ، ولكن لأنه يتم تشغيله كإشارة فرعية، يستمر البرنامج النصي الرئيسي.
في السياق، ربما يكون أبسط الإصلاح:
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
هذا يتحقق من حالة الخروج من خط الأنابيب يتكون من "القط" و "أثناء"، وهو حالة الخروج من حلقة "أثناء"، والتي ستكون 1 في المثال إذا تم العثور على 'foo: bar' في بداية خط.
بالطبع، هناك طرق أخرى للكشف عن ذلك، مثل:
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 فقط (nawk for solaris)
nawk -F":" '
topper($1)=="FOO" && topper($2)=="BAR"{
print "exist"
exit
}
{
print topper($0)
}
' file
يمكنك جعل شرطائك غير حساس بالحالة من خلال إضافة shopt -s nocasematch
فوق الاختبار. لتعيين الأشياء مرة أخرى إلى حساسة لحالة الأحوال: shopt -u nocasematch
.