বাশ স্ক্রিপ্ট লেখার সময় && এর সমতুল্য কী?


31

যদি এটি সদৃশ প্রশ্ন হয় তবে আমি আগাম ক্ষমা চাই। আমি এখানে জিজ্ঞাসা করার আগে অনুসন্ধান / চেক করার চেষ্টা করেছি।

আমি এই জাতীয় ওয়ান লাইনার লিখতে আরামদায়ক:

foocommand && foocommand2 && foocommand3

ধারণাটি হ'ল আমি পূর্ববর্তীটি "সফল" হলে কেবল পরবর্তী কমান্ডগুলি চালিত করতে চাই।

আমি কিছুটা দীর্ঘ স্ক্রিপ্ট লিখছি এবং এই ওয়ান-লাইনারটি কার্যকর নয় কারণ এটি অন্য সবার কাছে বিভ্রান্তিকর কোডের বিশাল ব্লকের মতো দেখাচ্ছে।

আমি কমান্ডগুলি ফাঁকা রাখতে চাই এবং স্ক্রিপ্টের মধ্যে তাদের মাঝে মন্তব্য লিখতে চাই। আমি কীভাবে এটি করতে পারি এবং এখনও সেখানে && এর সমতুল্য থাকতে পারি?


4
এই বহন পুনরাবৃত্তি: &&মানে এই নয় যদি পূর্ববর্তী পরবর্তী কমান্ড চালানো হবে এক সফল হয়েছে। এর মানে কমান্ড চালানো হবে যদি সমষ্টিগত ফলাফলের এর সব কমান্ড তালিকাতে থাকা পূর্ববর্তী কমান্ড সাফল্য। আপনি এটি জানেন তবে ভবিষ্যতে পাঠকরা ভুল বুঝতে পারে।
কোজিরো

1
এছাড়াও কেবল একটি নোট হিসাবে, আপনি যে আচরণটি বর্ণনা করছেন তা থেকে এসেছে ||এবং &&(এর বিপরীতে |বা এর বিপরীতে &) বলা হয় শর্ট সার্কিট। পরের অপারেটরগুলির সাথে ব্যবহার করা আচরণকে আগ্রহী মূল্যায়ন বলে।
অ্যান্ডি পারফেক্ট

7
@ কোজিরো: আমি পার্থক্যটি দেখতে পাচ্ছি না। সফল হলেই a && b && cচলবে , সুতরাং "এটি কেবল তখন সফল হয় যদি চালিত হয় " এবং "এটি কেবল তখনই চালিত হয় এবং উভয় সফল হয়" সমান বিবৃতি: সফল না হলে সফল হতে পারে না । bacbcabba
রুখ

1
@রুখ a || b && cআরও চিত্রিত।
কোজিরো

8
@রুখ না, true || false && echo hiআউটপুট হবে hiস্পেসিফিকেশনটি পড়ে, অপারেটরগুলি "&&" এবং "||" সমান প্রাধান্য পাবে এবং বাম সাহিত্যের সাথে মূল্যায়ন করা হবে।
কোজিরো

উত্তর:


23

আপনি এটি এর মতো করতে পারেন:

#!/bin/sh
ls -lh &&
    # This is a comment
    echo 'Wicked, it works!'

আমি আশা করি আপনি যা সঠিকভাবে জিজ্ঞাসা করেছেন আমি তা বুঝতে পেরেছি।


ধন্যবাদ। আমি যা আশা করছিলাম তার এটিই নিকটতম। এবং এটি প্রয়োজনে পুনরায় একটি লাইনারে রূপান্তর করা খুব সহজ করে তোলে।
মাইক বি বি

মাইক, যেহেতু আপনি কোড পরিষ্কারের বিষয়ে উদ্বিগ্ন, তাই একটি সাধারণ সম্মেলনটি প্রথমটির নীচে চেইনের 2-N বিভাগগুলি যুক্ত করা হয়।
jblaine

@jblaine আমি নিশ্চিত না আপনি কী বলতে চাইছেন তা আমি বুঝতে পেরেছি। আপনি দয়া করে বিস্তারিত বলতে পারেন?
মাইক বি

মাইক, স্ট্যাকেক্সচেঞ্জ আমাকে আমার উত্তরটি সঠিকভাবে ফর্ম্যাট করতে দেবে না, তাই এখানে আমার বোঝানো সমস্ত: ইন্ডেন্ট
জব্লায়েন

@jblaine ভাল পয়েন্ট, লাইনগুলি ইনডেন্ট করার জন্য সম্পাদিত।
ভোলকার সিগেল

38

আপনি শেবাং লাইন এ পরিবর্তন করতে পারেন

#!/bin/bash -e

কোনও ত্রুটির পরে, স্ক্রিপ্টটি বন্ধ হয়ে যাবে।


1
মজাদার. আমি এটা মনে রাখব. ধন্যবাদ.
মাইক বি বি

আমার যখন প্রয়োজন সেট-টাইপ করা থেকে আমাকে বাঁচায়
সিলভাররোকার ২৩ শে

@ সিলভার্রোকার এটি পজিক্স ( bashঅবশ্যই অংশ ব্যতীত )। পসিক্স শেলটি প্রযোজ্য এমন একগুচ্ছ বিকল্প গ্রহণ করে set। ্য মচক্সফন্দক্স? setস্ক্রিপ্টের মধ্যে শেল কমান্ড লাইন বিকল্পগুলি সেট করার একটি উপায়।
কাজ

7
দুর্ভাগ্যক্রমে, বেশ কয়েকটি স্ট্যান্ডার্ড ইউটিলিটি রয়েছে যা সাধারণ প্রস্থান-স্থিতি কনভেনশন অনুসরণ করে না, তাই -eএটি আচরণ করতে পারে। উদাহরণস্বরূপ, আপনি সম্ভবত চাইবেন না যে আপনার স্ক্রিপ্টটি প্রতিবার আপনি diffদুটি অ-অভিন্ন ফাইল মুছবেন। আপনি অবশ্যই এ জাতীয় আদেশগুলিতে || true(বা সম্ভবত || [ $? = 1 ]) সংযোজন করে এটিকে ঘিরে কাজ করতে পারেন তবে ওপি এমন একজন "অন্য সকলের" উল্লেখ করেছেন যাকে এই স্ক্রিপ্টটি পড়তে হবে এবং বলেছিলেন "অন্য প্রত্যেকে" সম্ভবত অভ্যস্ত হবে না সহ্য করা -e
রুখ

4
আমি -eশী-ঠুং ঠুং শব্দটি ব্যবহার করতাম , যতক্ষণ না আমার সংস্থার একজন প্রশাসক আমার স্ক্রিপ্টগুলি দিয়ে চালু bash myscript.shনা করে, তাই এটি এটিকে উপেক্ষা করে -e। এখন আমার সমস্ত স্ক্রিপ্টের একটি set -eদ্বিতীয় লাইনে রয়েছে।
কার্লোস ক্যাম্পাদ্রেস

19

আপনি যদি set -eধারণাটি পছন্দ না করেন তবে আপনি যুক্তিটি উল্টাতে পারেন।

foocommand || exit 1
foocommand2 || exit 2
foocommand3 || exit 3

আরও কার্যকরভাবে, exitএকটি কার্যকর ত্রুটি বার্তা মুদ্রণের জন্য কিছু দিয়ে প্রতিস্থাপন করুন, তারপরে প্রস্থান করুন। কোনও ফাংশনের অভ্যন্তরে অবশ্যই আপনি এটির returnপরিবর্তে চান exit


11
বা শূন্য-না হলে এর প্রস্থান স্থিতি foocommand || exitদিয়ে প্রস্থান করতে foocommand
স্টাফেন চেজেলাস 21

কিভাবে কাজ করে? এটি কি সি-এর মতো - যদি বাম আর্গুমেন্টটি সত্যের সাথে মূল্যায়ন করে, আর কোন আর্গুমেন্ট চেক করা হবে না?
ভোরাক

হ্যাঁ এটা ঠিক. এটি লিস্পে (এবং সাধারণভাবে কার্যকরী ভাষাগুলি, আমি মনে করি) এবং পার্লে একটি প্রচলিত প্রথা।
ট্রিপলি

9

if else fiপরিবর্তে আপনি ব্লক ব্যবহার করতে পারেন ।

if foocommand; then

  # some comments

  if foocommand2; then

    # more comments

    foocommand3
  fi
fi

এটি কিছুটা বেশি পঠনযোগ্য।

বিকল্পভাবে আপনি কেবল \আপনার বড় 1 লাইনারটিকে কয়েকটি লাইনে ভাঙতে ব্যবহার করতে পারেন

foocommand && \
  # some comment
  foocommand2 && \
    # more comment
    foocommand3

তবে অবশ্যই এটি প্রশিক্ষণহীন চোখে বিভ্রান্ত হতে পারে।


4
আমি মনে করি না যে \সেখানে প্রয়োজনীয়।
স্যামুয়েল এডউইন ওয়ার্ড

তুমি ঠিক. অভ্যাস বল।
মার্টন ক্যানভাল

5

আপনি নেস্টেড ifবিবৃতি ব্যবহার বিবেচনা করতে পারেন । অন্যান্য বিকল্প হ'ল কোঁকড়া ব্যবহার করতে পছন্দ করতে গ্রুপ পছন্দ{ true && echo hi; } || echo huh

আপডেট 1:

নিউলাইন / মন্তব্য ছাড়াই এখানে একটি উদাহরণ:

{ { false && echo "inner true"; } && { echo "inner true" && true; } || { echo "inner false" && false; } || echo "outter false"; }

@ স্টেফেন সেমিকোলন যুক্ত করার জন্য ধন্যবাদ আমি উত্তর দেওয়ার জন্য আমার ফোনটি ব্যবহার করছি যাতে আমার উত্তরগুলি দ্বিগুণ হয় নি। :)
লিভিংস্ট্যাচাটো

আকর্ষণীয় ধারণা। হ্যাঁ, আমি বাসাবাড়ির কথা ভেবেছিলাম যদি বিবৃতি দেওয়া হয় তবে আমি যদি প্রচুর স্টাফ একসাথে শৃঙ্খলিত করি তবে এটি অগোছালো হতে পারে।
মাইক বি

4

কমান্ডের প্রতিটি অনুক্রমকে ফাংশনে বিভক্ত করুন:

big_block_1() {
  # ...
}
big_block_2() {
  # ...
}
big_block_3() {
  # ...
}

big_block_1 && big_block_2 && big_block_3

0

আমি সর্বদা একটি "ব্যর্থ" ফাংশন লিখতে চাই যা ব্যর্থতা হওয়ার সময় আমি যে জিনিসটি করতে যাচ্ছিলাম তা নির্দিষ্ট করতে এবং তারপরে ||প্যাটার্নটি ব্যবহার করতে পারি । নীচের মত:

function fail() {
  echo "Failure: ${@}"
  exit 1
}

foocommand || fail "couldn't foo"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.