linux - meaning - bash معنى



[: عامل تشغيل غير متوقع في برمجة shell (6)

في الرمز الخاص بك استبدال هذا السطر:

#!/bin/sh

مع

#!/bin/bash

يجب أن يكون هذا السطر الأول من النص البرمجي ويشير إلى استخدام shell linux. لا يدعم sh نفس الأوامر مثل bash.

https://src-bin.com

هذا السؤال لديه بالفعل إجابة هنا:

رمز بلدي:

    #!/bin/sh
    #filename:choose.sh
    read choose
    [ "$choose" == "y" -o "$choose" == "Y" ] && echo "Yes" && exit 0
    [ "$choose" == "n" -o "$choose" == "N" ] && echo "No"  && exit 0
    echo "Wrong Input" && exit 0

لكن عندما أقوم بالتنفيذ

    sh ./choose.sh

المحطة تطالبني بذلك

   [: 4: n: :Unexpected operator
   [: 5: n: :Unexpected operator

هل هناك أي خطأ في البرنامج النصي bash؟ شكر!


Answer #1

في الواقع ، إن قوس فتح "[" هو مجرد اسم مستعار داخلي لـ أمر اختبار.

لذلك يمكنك أن تقول:

test -f "/bin/bash" && echo "This system has a bash shell"

أو

[ -f "/bin/bash" ] && echo "This system has a bash shell"

... فهي تعادل إما في sh أو bash. لاحظ متطلبات وجود قوس إغلاق "]" على الأمر "[" ولكن بخلاف ذلك "["] هو نفسه "اختبار". "اختبار رجل" أمر جيد للقراءة.


Answer #2

لا يفهم POSIX sh == للمساواة في السلسلة ، لأن هذه هي bash -ism. استخدم = بدلا من ذلك.

الأشخاص الآخرون الذين يقولون أن الأقواس غير مدعومة من قبل sh خاطئة ، راجع للشغل.


Answer #3

لا يوجد خطأ في البرنامج النصي bash . ولكنك تقوم بتنفيذها باستخدام sh الذي يحتوي على بنية أقل شمولاً ؛)

لذا ، قم بتشغيل bash ./choose.sh بدلاً من ذلك :)


Answer #4

يجب عليك استخدام bash بدلاً من ذلك أو إعادة كتابة النص البرمجي باستخدام sh القياسي

sh -c 'test "$choose" = "y" -o "$choose" = "Y"'

Answer #5

يمكنك استخدام case / esac بدلاً من / else

case "$choose" in
  [yY]) echo "Yes" && exit;;
  [nN]) echo "No" && exit;;
  * ) echo "wrong input" && exit;;
esac




shell