একাধিক শর্তযুক্ত বিবৃতি যদি ত্রুটি ছুড়ে দেয় তবে বাশ দিন


165

আমি এমন একটি স্ক্রিপ্ট লেখার চেষ্টা করছি যা দুটি ত্রুটিযুক্ত পতাকাগুলি পরীক্ষা করবে এবং যদি একটি পতাকা (বা উভয়) পরিবর্তিত হয় তবে এটি প্রতিধ্বনিত হবে - ত্রুটি ঘটবে। আমার লিপি:

my_error_flag=0
my_error_flag_o=0
do something.....
if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" &&     "$my_error_flag_o"="2" ]]; then
    echo "$my_error_flag"
else
    echo "no flag"
fi

মূলত, এটি কিছুটা বরাবর হওয়া উচিত:

if ((a=1 or b=2) or (a=1 and b=2))
  then
     display error
else
     no error
fi

আমি যে ত্রুটি পেয়েছি তা হ'ল:

 line 26: conditional binary operator expected
 line 26: syntax error near `]'
 line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then'

আমার বন্ধনীগুলি গণ্ডগোল হয়েছে?



2
প্রথম বন্ধনী ব্যবহার করুন - ()
AlikElzin-kilaka


3
যৌক্তিকভাবে, a==1 or b==2ইতিমধ্যে কেস কভার যেখানে a==1 and b==2। তার জন্য পৃথকভাবে পরীক্ষা করা এখানে সম্পূর্ণ অনাবৃত।
tripleee

সম্পর্কিত: বাশ
কোডফোরস্টার

উত্তর:


249

-a(এবং জন্য) এবং -o(বা জন্য) অপারেশন ব্যবহার করুন Use

tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

হালনাগাদ

আসলে আপনি এখনও &&এবং অপারেশন ||সহ ব্যবহার করতে পারেন -eq। সুতরাং আপনার লিপিটি এরকম হবে:

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ] || ([ $my_error_flag -eq 1 ] && [ $my_error_flag_o -eq 2 ]); then
      echo "$my_error_flag"
else
    echo "no flag"
fi

যদিও আপনার ক্ষেত্রে আপনি শেষ দুটি এক্সপ্রেশন ফেলে দিতে পারেন এবং কেবল একটির সাথে বা এই জাতীয় ক্রিয়াটি আটকে রাখতে পারেন:

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ]; then
      echo "$my_error_flag"
else
    echo "no flag"
fi

3
@Simply_Me: না, একটি লজিক্যাল বা সত্য হলে হয় অথবা উভয় তার operands এর সত্য। আপনি "এক্সক্লুসিভ বা" (এক্সওআর) এর কথা ভাবছেন, যা সত্য যদি এর অপারেশনগুলির মধ্যে একটি সত্য হয়। (প্রকৃতপক্ষে, এক্সওআর এর সংস্করণ রয়েছে যা 2 টিরও বেশি অপারেন্ডে কাজ করে, এক্ষেত্রে যদি বিজোড় সংখ্যক অপারেটর সত্য হয় তবে এটি সত্য))
গর্ডন ডেভিসন

4
বিটিডাব্লু, মূল কোডটিতে সমস্যাগুলির মধ্যে রয়েছে গ্রুপিং (এবং তারা এটি করে না) ব্যবহার করে [এবং ]অপারেটরের চারপাশে স্পেস স্থাপন করতে ব্যর্থ হয় (উদাঃ "$my_error_flag"="1"), যা শেলটিকে একে অপারেটর হিসাবে স্বীকৃতি দিতে বাধা দেয়। দয়া করে বাশফ্যাঙ্ক # 17 (গ্রুপিংয়ের ক্ষেত্রে) এবং # 31 (বিভিন্ন ধরণের পরীক্ষার এক্সপ্রেশনের মধ্যে পার্থক্য নিয়ে) পড়ুন । আসলে, এক্ষেত্রে পাটিগণিতের এক্সপ্রেশন ব্যবহার করা আরও সহজ হবে ।
গর্ডন ডেভিসন

7
-aএবং POSIX স্পেসিফিকেশন-o দ্বারা অপ্রচলিত হিসাবে বিবেচিত হয় ; আপডেট হিসাবে মিলিত পৃথক পরীক্ষা ব্যবহার করুন । ||
চিপনার

1
সাবসেল ব্যবহার করে গ্রুপিং করার দরকার নেই, সাধারণত ব্যবহার করে গ্রুপিং {}করাও সম্ভব হওয়া উচিত।
পিএইচকে

1
উপরের পিএইচসি-র মন্তব্যে যোগ করার জন্য, () ব্যাশে সাব-শেলগুলি চালু করছে, এতে সমস্ত ধরণের সূক্ষ্ম [সম্ভবত অযাচিত] প্রভাব থাকতে পারে।
ব্রেট

70

আপনি হয় [[বা ((কীওয়ার্ড ব্যবহার করতে পারেন । আপনি ব্যবহার করেন, তখন [[শব্দ, আপনি যেমন হিসাবে ব্যবহারের স্ট্রিং অপারেটর -eq, -lt। আমি মনে করি, ((সবচেয়ে গাণিতিক জন্য পছন্দ করা হয়, কারণ আপনি সরাসরি যেমন অপারেটর ব্যাবহার করতে পারেন ==, <এবং >

[[অপারেটর ব্যবহার

a=$1
b=$2
if [[ a -eq 1 || b -eq 2 ]] || [[ a -eq 3 && b -eq 4 ]]
then
     echo "Error"
else
     echo "No Error"
fi

((অপারেটর ব্যবহার

a=$1
b=$2
if (( a == 1 || b == 2 )) || (( a == 3 && b == 4 ))
then
     echo "Error"
else
     echo "No Error"
fi

ব্যবহার করবেন না -aবা -oঅপারেটার যেহেতু এটা পোর্টেবল নয়।


8

নিম্নলিখিত চেষ্টা করুন

if ([ $dateR -ge 234 ] && [ $dateR -lt 238 ]) || ([ $dateR -ge 834 ] && [ $dateR -lt 838 ]) || ([ $dateR -ge 1434 ] && [ $dateR -lt 1438 ]) || ([ $dateR -ge 2034 ] && [ $dateR -lt 2038 ]) ;
then
    echo "WORKING"
else
    echo "Out of range!"

2
( ... )সাবস্কেলগুলি তৈরি করে - কোনও লাভের জন্য প্রচুর পারফরম্যান্স প্রভাব।
চার্লস ডাফি

4
{ ...; }সাবস্কেল তৈরি না করে গ্রুপিংয়ের জন্য ব্যবহার করুন ।
চার্লস ডাফি

1

মাইএসকিউএল থেকে অবদানকারীদের দ্বারা লিখিত একটি entrypoint.sh স্ক্রিপ্ট পড়ে আপনি কিছুটা অনুপ্রেরণা পেতে পারেন যা নির্দিষ্ট ভেরিয়েবলগুলি সেট করা আছে কিনা তা পরীক্ষা করে।

স্ক্রিপ্টটি যেমন দেখায়, আপনি সেগুলি পাইপ করতে পারেন -a, উদাহরণস্বরূপ:

if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
    ...
fi

1
-aপসিক্স testস্ট্যান্ডার্ডের বর্তমান সংস্করণে অপ্রচলিত হিসাবে চিহ্নিত ; pubs.opengroup.org/onlinepubs/9699919799/utilities/test.htmlOB এ চিহ্নিতকারীগুলি দেখুন । আরও নির্ভরযোগ্য কোড ব্যবহার করুন । [ -z "$FOO" ] && [ -z "$BAR" ]
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.