سؤال شرطية متعددة في البرنامج النصي shell


هذا يقودني الى الجنون. هناك العديد من المشاركات على هذا ولكن لا شيء يعمل بالنسبة لي. أرغب في التحقق مما إذا كان الملف ليس avi أو mpg ثم أريد الخروج منه. اليك مثال بسيط:

#!/bin/sh

extension="avi"
if [ $extension != "avi" ] || [ $extension != "mpg" ]; then
        echo "ERROR: File is not an avi or mpg"
        exit 1
fi
echo "I should print out"

هذا دائماً إرجاع رسالة خطأ الذي لا ينبغي. لقد حاولت أيضا:

if [[ $extension != "avi" ]] || [[ $extension != "mpg" ]]; then
if ([[ $extension != "avi" ]] || [[ $extension != "mpg" ]]); then
if [ $extension != "avi" -o $extension != "mpg" ]; then

ماذا ينقصني؟


2
2018-04-09 18:57


الأصل




الأجوبة:


لقد ارتكبت خطأ في المنطق الخاص بك. يجب ملء كلا الشرطين ليس فقط حتى تحتاج إلى مشغل AND (&&) بدلاً من OR (||). محاولة:

if [ $extension != "avi" ] && [ $extension != "mpg" ]; then

أو أكثر أناقة:

if [ $extension != "avi" -a $extension != "mpg" ]; then

3
2018-04-09 19:04



صحيح ، ولكن ليس الأمثل. قمت بتحرير الجواب لواحد test. - Rich Homolka
RichHomolka قمت بتحرير المنشور مرة أخرى لإظهار كلا الحلول. على الرغم من أن الحل الخاص بك أكثر أناقة ، إلا أنني أشعر أن إجاباتي على السؤال بشكل أفضل من خلال إظهار ما هو الخطأ في البيان الأولي. والتفسير مع مشغل && يجعل من المنطقي أكثر. - Simon


case صياغات مصممة لهذا النوع من الموقف على وجه التحديد. مع المثال المعطى ، شيء من هذا القبيل:

#!/bin/sh

extension="avi"
case "$extension" in
  avi | mpg )
    echo "I should print out"
    ;;
  * )
    echo "ERROR: File is not an avi or mpg"
    exit 1
    ;;
esac

هذا له مزايا واضحة من أن يكون أكثر سهولة في التوسع والقراءة.


2
2018-04-09 19:19



case هو في الواقع أفضل حل لهذا بدلا من if. - ott--