বাশ স্ক্রিপ্টে শর্ত থাকলে নেগেট করুন


162

আমি মারতে নতুন এবং আমি নিম্নলিখিত আদেশটি উপেক্ষা করার চেষ্টা করতে আটকেছি:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -eq 0 ]]; then
        echo "Sorry you are Offline"
        exit 1

আমি যদি ইন্টারনেটের সাথে সংযুক্ত থাকি তবে শর্তটি সত্য হয়ে যায়। আমি এটি অন্য উপায়ে ঘটাতে চাই তবে !কোথাও রাখার কাজটি মনে হয় না।


3
যেখানে আপনি এটি করা? if ! [[ ...কাজ করে
অন্য

1
আপনি এটিও এভাবে ব্যবহার করতে পারেন: আপনার_এক্সএক্সএক্সএক্সএক্সএক্স_প্যারামগুলি || (প্রতিধ্বনি "ওহ ওহ" ও & প্রস্থান 1)
কেএস

2
> একটি ত্রুটি আউটপুট করার জন্য একটি
সাবশেলকে কল করা

উত্তর:


227

তুমি পছন্দ করতে পারো:

if [[ $? -ne 0 ]]; then       # -ne: not equal

if ! [[ $? -eq 0 ]]; then     # -eq: equal

if [[ ! $? -eq 0 ]]; then

! নিম্নলিখিত এক্সপ্রেশনটির যথাক্রমে প্রত্যাবর্তনকে উল্টে দেয়।


9
ডাবল বন্ধনী প্রয়োজনীয়? এটা কেন?
আলেকজান্ডার মিলস

1
@ আলেকজান্ডারমিলস: এটি করার বিভিন্ন উপায় রয়েছে। ডাবল বা একক বন্ধনী সহ বা testকমান্ড সহ:if test $? -ne 0; then
সাইরাস

4
এই উত্তরটি অপ্রয়োজনীয় শব্দভাণ্ডার। if0 বা 1 এর একটি বিবৃতি প্রত্যাশা করে, তাই আপনি নিজেই কমান্ডটি ব্যবহার করতে পারেন এবং এটি উল্টিয়ে দিতে পারেন:if ! wget ...; then ...; fi
নীলস ম্যাগনাস

87

উত্তম

if ! wget -q --spider --tries=10 --timeout=20 google.com
then
  echo 'Sorry you are Offline'
  exit 1
fi

1
গুরুত্বপূর্ণ: !নীচের এবং নীচের কমান্ডের মধ্যে একটি স্থান রাখুন অন্যথায় আপনি ইতিহাসের সম্প্রসারণ করছেন। unix.stackexchange.com/questions/3747/…
রোল্যান্ড

2
স্টিভেনের কেন কেবল আপনার খ্যাতি আছে?
রোল্যান্ড

8

যদি আপনি অলস বোধ করেন তবে অপারেশনের পরে (এবং) ||এবং &&(এবং) ব্যবহার করে শর্তগুলি পরিচালনা করার একটি ক্ষুদ্র পদ্ধতি এখানে রয়েছে :

wget -q --tries=10 --timeout=20 --spider http://google.com || \
{ echo "Sorry you are Offline" && exit 1; }

8
রিয়েল-লাইফ স্ক্রিপ্টগুলিতে আপনার &&ইকো কমান্ডের পরে একটিতে পরিবর্তিত হওয়া উচিত ;। এর কারণ হ'ল যদি সম্পূর্ণ ডিস্কের কোনও ফাইলে আউটপুট পুনর্নির্দেশ করা হয়, তবে echoব্যর্থতা ফিরে আসবে এবং exitকখনই আগুনে ফিরবে না। এটি সম্ভবত আপনি চান আচরণ নয়।
স্কোর_আউন্ডের

বা আপনি ব্যবহার করতে পারেন set -eএবং ব্যর্থতা echoযাইহোক স্ক্রিপ্ট থেকে প্রস্থান করবে
জাকুব বোচেনস্কি

4

যেহেতু আপনি সংখ্যার তুলনা করছেন, আপনি একটি গাণিতিক এক্সপ্রেশন ব্যবহার করতে পারেন , যা প্যারামিটারগুলি এবং তুলনামূলক সহজ পরিচালনা করার অনুমতি দেয়:

wget -q --tries=10 --timeout=20 --spider http://google.com
if (( $? != 0 )); then
    echo "Sorry you are Offline"
    exit 1
fi

পরিবর্তে কিভাবে খেয়াল করুন -ne, আপনি কেবল ব্যবহার করতে পারেন !=। একটি গাণিতিক প্রসঙ্গে, আমাদের এমনকি $পরামিতিগুলিতে অর্থ প্রদান করতে হবে না , অর্থাৎ,

var_a=1
var_b=2
(( var_a < var_b )) && echo "a is smaller"

পুরোপুরি সূক্ষ্ম কাজ করে। $?যদিও এটি বিশেষ প্যারামিটারে প্রয়োগ হয় না ।

আরও, যেহেতু (( ... ))শূন্য-অ-মানকে সত্য হিসাবে মূল্যায়ন করা হয়, অর্থাৎ শূন্য-অমূল্যগুলির জন্য 0-এর রিটার্ন স্ট্যাটাস এবং অন্যথায় 1 এর রিটার্নের স্ট্যাটাস রয়েছে, অন্যথায় আমরা সংক্ষিপ্ত করতে পারি

if (( $? )); then

তবে এটি সংরক্ষিত কীস্ট্রোকের চেয়ে বেশি লোককে বিভ্রান্ত করতে পারে।

(( ... ))কনস্ট্রাক্ট ব্যাশ পাওয়া যায়, কিন্তু দ্বারা প্রয়োজন হয় না POSIX শেল স্পেসিফিকেশন (যদিও সম্ভব এক্সটেনশান হিসাবে উল্লিখিত)।

এই সব বলা হচ্ছে, কোলের উত্তর এবং স্টিভেনের উত্তরের$? মতো আমার মতে সম্পূর্ণ এড়ানো ভাল ।



@ ডেভিডসি.রঙ্কিন ওহ, আমি এটি পেলাম না! সুতরাং এটি একটি এক্সটেনশন হিসাবে উল্লেখ করা হয়েছে, তবে প্রয়োজন নেই। আমি সংশোধন করব।
বেনিয়ামিন ডাব্লু।

1
হ্যাঁ, তিনি আমাকে সবসময় পেয়েছিলেন। যদিও এটি শেলকে আরও সহজ করে তোলে:)
ডেভিড সি র্যাঙ্কিন

4

আপনি এর -neপরিবর্তে অসম তুলনা ব্যবহার করতে পারেন -eq:

wget -q --tries=10 --timeout=20 --spider http://google.com
if [[ $? -ne 0 ]]; then
    echo "Sorry you are Offline"
    exit 1
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.