سؤال

لدي البرنامج النصي التالي

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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top