যদি ব্যাশ শেলের একাধিক লাইনে শর্ত থাকে


19

আমার একটি বাশ শেল ফাংশন রয়েছে যা একটি আর্গুমেন্ট গ্রহণ করে এবং প্রয়োজনে এটিতে কিছু সম্পাদন করে।

do_somthing() {
  if [need to do something on $1]
  then
    do it
    return 0
  else
    return 1
  fi
}

আমি বেশ কয়েকটি যুক্তি দিয়ে এই পদ্ধতিটি কল করতে এবং তাদের মধ্যে কমপক্ষে কোনও একটি সফল হয়েছে কিনা তা পরীক্ষা করতে চাই।

আমি এরকম কিছু চেষ্টা করেছি:

if [ do_something "arg1" ||
     do_something "arg2" ||
     do_something "arg3" ]
then
  echo "OK"
else
  echo "NOT OK"
fi

তার জন্য সঠিক বাক্য গঠন কী হবে? এছাড়াও
সম্পাদনা করুন
- আমি নিশ্চিত করতে চাই যে প্রথম শর্তটি সত্য হলেও অন্য সমস্ত শর্তটি এখনও মূল্যায়ন করা হবে।

ধন্যবাদ,


আমি আমার উত্তর আপডেট করেছি।
টেকট্যাক্স

ধন্যবাদ, আপনি একটি উদাহরণ প্রদান করতে পারেন?
Itay

1
আমি আমার উত্তরে একটি কোড উদাহরণ যুক্ত করেছি।
টেকট্যাক্স

উত্তর:


7

কমান্ডগুলি প্রথমে চালান, তারপরে তাদের কমপক্ষে কোনও একটি সফল হয়েছে কিনা তা পরীক্ষা করে দেখুন।

#!/bin/bash

success=0
do_something arg1 && success=1
do_something arg2 && success=1
do_something arg3 && success=1

if ((success)); then
    printf 'Success! At least one of the three commands succeeded\n'
fi

3
এটি বিভ্রান্তিকর, আমি খুশি হব যদি আপনি শর্তাধীন বিবৃতি কীভাবে ব্যাশে কাজ করে ..., সাফল্যের পরে 0 কী করে কিছু প্রত্যাবর্তন করে তার কিছু ব্যাখ্যা দিতে পারলেও আমরা সাফল্যটিকে 1 তে আপডেট করি, এর if ((success))চেয়ে আলাদা কিছুতে মূল্যায়ন করি if success। আমি বিভ্রান্ত :)
Itay

2
@ ((...))এটি একটি গাণিতিক আদেশ। যদি ফলাফলটি ভিতরে থাকে তবে শূন্য হয় না, এটি সত্য (0) দেয়। যদি ফলাফলটির ভিতরে 0 হয় তবে এটি মিথ্যা (1) ফেরায় returns "সাফল্য" কে একটি পরিবর্তনশীল হিসাবে বিবেচনা করা হয় যা এটি একটি সংখ্যক ধারণ করে বলে আশা করে। Mywiki.wooledge.org/ArithmeticExpression
গিরিহা

ধন্যবাদ, আমি অনুমান করি যে অংশটি আমাকে বিভ্রান্ত করেছিল তা হল 0 সত্য এবং 1 টি মিথ্যা সাধারণত এটি বিপরীত হয় :)
Itay

2
@ এটি হ্যাঁ, এটি প্রথমে বিভ্রান্তিকর হতে পারে। বাশ সাধারণ উদ্দেশ্যে ভাষাগুলির চেয়ে পৃথক যে এটি "কমান্ড ভিত্তিক"; এটি ফাংশনগুলি কল করে না, এর ক্লাস এবং পদ্ধতি নেই, এটি কমান্ড চালায় এবং কমান্ডের প্রস্থান স্থিতিগুলি পরীক্ষা করে। এবং সি, পাইথন, জাভা, পার্ল ইত্যাদির মতো ভাষাগুলির চেয়ে বাশনে কমান্ডগুলি চালানো অনেক সহজ is সাফল্যের সংকেত দিতে কমান্ডগুলি 0 দিয়ে বের হয় এবং বিভিন্ন ধরণের ব্যর্থতার জন্য 1-255। (একটি কমান্ড কেবলমাত্র একটি উপায়ে সফল হতে পারে তবে বিভিন্ন কারণে ব্যর্থ হয়)
গিরিহা

2
এই সমাধানটির সুবিধা রয়েছে যে আপনি অস্থায়ীভাবে তাদের নিষ্ক্রিয় করতে চান না এমন লাইনগুলি আপনি মন্তব্য করতে পারেন
জোশিয়াহ ইয়্ডার

31

ব্যাকস্ল্যাশ ব্যবহার করুন।

if [ $(do_something "arg1") ] || \
   [ $(do_something "arg2") ] || \
   [ $(do_something "arg3") ]
then
  echo "OK"
else
  echo "NOT OK"
fi

সম্পাদনা

এছাড়াও - আমি নিশ্চিত করতে চাই যে প্রথম শর্তটি সত্য হলেও অন্য সমস্ত শর্ত এখনও মূল্যায়ন করা হবে।

বিবৃতি যদি কেবল একটিতে এটি সম্ভব না in পরিবর্তে আপনি এমন একটি লুপ ব্যবহার করতে পারেন যা আর্গুমেন্টগুলির মাধ্যমে পুনরাবৃত্তি করে এবং পৃথকভাবে তাদের মূল্যায়ন করে। কিছুটা এইরকম:

do_something() {
  for x in "$@"
  do
    if [need to do something on $x]
    then
      do it
    else
      echo "no action required on $x"
    fi
  done
}

ধন্যবাদ, চেষ্টা করে দেখুন - আমি একটি ত্রুটি পেয়েছি[: do_something: unary operator expected
এটি

আপনি কি প্রতিটি মূল্যায়নকে তার নিজের বন্ধনীগুলির মধ্যে রেখেছিলেন? [ expr1 ] || [ expr2 ]পরিবর্তে তাই [ expr1 || expr2 ]
টেকটাক্স

হ্যাঁ, আমি করেছি: (...
এটি

আমার অনুমান যে do_something "arg1"দুটি আর্গুমেন্ট হিসাবে ব্যাখ্যা করা হয় যেখানে অভিব্যক্তি একরকম হওয়া উচিত। কোনও do_something "arg1"যুক্তিই একটি যুক্তি হিসাবে মূল্যায়ন করা হয়?
Itay

1
তুমি ঠিক বলছো. এই অত্যন্ত কাজ করে: if [ $(do_something "arg1") ]
টেকট্যাক্স

5

সঠিক বাক্য গঠনটি হ'ল:

if  do_something "arg1" || \
    do_something "arg2" || \
    do_something "arg3"
then
  echo "OK"
else
  echo "NOT OK"
fi

\ শেলটি বলতে পরবর্তী পংক্তিতে একটি কমান্ড অব্যাহত রাখতে ব্যবহৃত হয়।

সম্পাদনা : আমি মনে করি এটি যা করা উচিত তা করা উচিত:

#!/bin/bash

do_something() {
  if [need to do something on $1]
  then
    do it
    echo "OK"
  else
    echo "NOT OK"
  fi
}

do_something "arg1"
do_something "arg2"
do_something "arg3"

ধন্যবাদ, একটি ত্রুটির সাথে ফলাফল:[: too many arguments
এটি

@ এটি উত্তর আপডেট হয়েছে।
এরিক কারভালহো

প্রশ্ন আপডেট করা - এটি এখনও চূড়ান্ত উত্তর নয় :(
ইটায়

-1

আমি পছন্দ করি:

if {
    do_something "arg1" ||
    do_something "arg2" ||
    do_something "arg3"
}; then
    echo "OK"
else
    echo "NOT OK"
fi

আপনার স্ক্রিপ্টটি মোটেও কাজ করবে না: প্রথম পরীক্ষার প্যারামিটারের পরে এটি একটি \nঅক্ষর তৈরি করবে , সুতরাং আপনার ifবক্তব্যটি কিছু ত্রুটি তৈরি করবে, এবং do_somethingআদেশের নাম নয়, তাই আরও ত্রুটি
দামাদাম

আমার জন্য এটি zsh এবং ব্যাশে কাজ করে, IF do_somethingঅবশ্যই একটি ফাংশন। do_somethingফাংশন বা কমান্ড হতে হবে, এটি আর কি হওয়া উচিত? \nফলাফলটি প্রতিধ্বনিত হওয়া বাদে এটি কোনও চরিত্র কোথায় তৈরি করবে তা আমি দেখতে পাই না এবং এটি প্রত্যাশিত ...
টক্সিরো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.