কীভাবে একজন কমান্ডের প্রস্থান স্থিতিটিকে ভেরিয়েবলের মধ্যে নিষ্কাশন করতে পারে?


14

আমি কয়েক দিন আগে বাশ শিখতে শুরু করি।

আমি grepএই মত একটি চলক মধ্যে প্রকাশের একটি প্রস্থান স্থিতি পেতে চেষ্টা করছি :

check=grep -ci 'text' file.sh

এবং আমি যে আউটপুট পেয়েছিলাম তা হল

No command '-ic' found

আমি পাইপ কমান্ড দিয়ে এটি করা উচিত?


6
প্রস্থান স্থিতির জন্য আপনি $?কমান্ড শেষ হওয়ার পরে সঠিকভাবে পরীক্ষা করতে পারবেন ।
coffeMug

এবং আপনি পাইপলাইনে যে কোনও একটি আদেশের স্থিতি চাইলে আপনি পিপেষ্টাস্টাস অ্যারে পরীক্ষা করতে পারেন।
কাস

উত্তর:


26

আপনার আদেশ,

check=grep -ci 'text' file.sh

যেমন শেল ব্যাখ্যা করা হবে "কমান্ড চালানোর -ciআর্গুমেন্ট সহ textএবং file.sh, এবং পরিবর্তনশীল সেট checkমান grepতার পরিবেশে"।


শেলটি ভেরিয়েবলের মধ্যে সর্বাধিক সম্পাদিত কমান্ডের প্রস্থান মূল্য সঞ্চয় করে ?। আপনি এর মতো আপনার নিজের ভেরিয়েবলগুলির একটিতে এর মান নির্ধারণ করতে পারেন:

grep -i 'PATTERN' file
check=$?

আপনি যদি এই মানটিতে কাজ করতে চান তবে আপনি হয় আপনার checkভেরিয়েবল ব্যবহার করতে পারেন :

if [ "$check" -eq 0 ]; then
    # do things for success
else
    # do other things for failure
fi

অথবা আপনি একটি পৃথক ভেরিয়েবল ব্যবহার করে এবং $?সমস্ত একসাথে পরিদর্শন করে এড়িয়ে যেতে পারেন :

if grep -q -i 'pattern' file; then
  # do things (pattern was found)
else
  # do other things (pattern was not found)
fi

(দ্রষ্টব্য -q, এটি grepকোনও কিছুর আউটপুট না এনে এবং কোনও কিছুর মিলের সাথে সাথে প্রস্থান করার নির্দেশ দেয়; আমরা এখানে কী মিলছে তাতে আমরা সত্যিই আগ্রহী নই)

বা, যদি প্যাটার্নটি পাওয়া না যায় আপনি যদি কেবল "জিনিসগুলি" করতে চান :

if ! grep -q -i 'pattern' file; then
  # do things (pattern was not found)
fi

$?অন্য ভেরিয়েবলে সংরক্ষণ করা কেবল তখনই প্রয়োজন হয় যখন আপনাকে পরে ব্যবহার করতে হবে, যখন মানটি $?ওভাররাইট করা হয়েছে, যেমন হিসাবে

mkdir "$dir"
err=$?

if [ "$err" -ne 0 ] && [ ! -d "$dir" ]; then
    printf 'Error creating %s (error code %d)\n' "$dir" "$err" >&2
    exit "$err"
fi

উপরের কোড স্নিপেটে, পরীক্ষার $?ফলাফল দ্বারা ওভাররাইট করা হবে [ "$err" -ne 0 ] && [ ! -d "$dir" ]। এটিকে এখানে সংরক্ষণ করা কেবলমাত্র তখনই প্রয়োজন যদি আমাদের এটির প্রদর্শন এবং এটি ব্যবহার করতে হয় exit


4

আপনার প্রশ্নটি অস্পষ্ট তবে আপনি যে কোডটি জমা দিয়েছেন তার উপর ভিত্তি করে মনে হচ্ছে আপনি ভেরিয়েবলটি কমান্ডের checkপ্রস্থান স্থিতি সংরক্ষণ করতে চান grep। এটি করার উপায়টি চালানো

grep -ci 'text' file.sh
check=$?

শেল থেকে কমান্ড চালানোর সময়, এর প্রস্থান স্থিতি বিশেষ শেল প্যারামিটারের মাধ্যমে উপলব্ধ করা হয় $?

এটি পসিক্স (ইউনিক্সের মতো অপারেটিং সিস্টেমগুলির মান) শেলটির জন্য তার স্পেসিফিকেশনে নথিভুক্ত করেছে এবং ব্যাশ বাস্তবায়ন বিশেষ প্যারামিটারের অধীনে নথিভুক্ত করা হয়েছে ।

যেহেতু আপনি একজন নতুন শিক্ষানবিস, তাই আমি দৃ strongly়ভাবে সুপারিশ করব যে আপনি ভাল বই এবং / অথবা অনলাইন টিউটোরিয়ালটি বেসিকগুলি পেতে শুরু করুন। স্ট্যাক এক্সচেঞ্জের সাইটগুলিতে বাহ্যিক সংস্থার সুপারিশগুলি নিরুৎসাহিত করা হয় তবে আমি লুনাথ এবং গ্রেগ্যাটিকের বাশ গাইডের পরামর্শ দিই


4

আপনি বাশকে check=grepকমান্ডের কাছে যে পরিবেশে পরিবর্তন করে তা পরিবেশের পরিবর্তনশীল সেট করতে বলেছিলেন

-ci 'text' file.sh

কিন্তু ciঅস্তিত্ব নেই।

আমি বিশ্বাস করি যে আপনি এই আদেশটি ব্যাক-টিকগুলিতে বা ডলারের চিহ্নের আগে বন্ধনীগুলিতে আবদ্ধ করতে চেয়েছিলেন, যার মধ্যে দুটিই 'টেক্সট' ফাইলের (সংবেদনশীলতার ক্ষেত্রে) কত লাইনের সন্ধান পেয়েছিল তা গণনা করে:

check=`grep -ci 'text' file.sh`

check=$(grep -ci 'text' file.sh)

এখন $checkকোনও মিল না থাকলে 0 বা কোনও ম্যাচ থাকলে ইতিবাচক হওয়া উচিত।


1

বিভ্রান্ত কেন আউটপুট পরীক্ষা করার সময় -c ব্যবহার করছেন? কোনও জিনিস কতবার মিলছে তা যাচাই করতে এটি ব্যবহার করা হয় - এটি সফল কিনা বা না তা নয়।

   -c, --count
          Suppress normal output; instead print a count of matching  lines
          for  each  input  file.  With the -v, --invert-match option (see
          below), count non-matching lines.  (-c is specified by POSIX.)

কিন্তু এই উদাহরণে

check="$(grep --silent -i 'text' file.sh; echo $?)"

এটি একটি প্রস্থান কোড ব্যতীত অন্য কোনও ফলাফল দেয় না, যা পরে প্রতিধ্বনিত হয়। এটি আউটপুট যা ভেরিয়েবল চেক ব্যবহার করে। আমি এটিকেও পছন্দ করি কারণ এটি একটি একক লাইন।

আপনি -s এর সাথে নিরস্তর প্রতিস্থাপন করতে পারেন। আপনি গ্রেপ আউটপুটটিতে আগ্রহী নন যেহেতু, এটি কাজ করুক বা না করুক আমি তা ব্যবহার করি।

   -q, --quiet, --silent
          Quiet;  do  not  write  anything  to  standard   output.    Exit
          immediately  with  zero status if any match is found, even if an
          error was detected.  Also see the -s  or  --no-messages  option.
          (-q is specified by POSIX.)

$ check=$(echo test | grep -qi test; echo $?) # check variable is now set
$ echo $check
0
$ check=$(echo null | grep -qi test; echo $?)
$ echo $check
1

1

একটি ভেরিয়েবলকে গ্রেপ কমান্ডের আউটপুট নির্ধারণের সঠিক উপায়টি হ'ল @ মন্টি-হার্ড উল্লেখ করা হয়েছে:

check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)

এই কমান্ডের প্রস্থান স্থিতিটি একটি ভেরিয়েবলের জন্য নির্ধারণ করার $?পরে আপনাকে নীচের চিত্রের মতো কমান্ডটি প্রয়োগ করার পরে শেল প্যারামিটারটি ব্যবহার করতে হবে :

grep -ci 'text' file.sh
check=$?
echo $check
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.