আমি কয়েক দিন আগে বাশ শিখতে শুরু করি।
আমি grep
এই মত একটি চলক মধ্যে প্রকাশের একটি প্রস্থান স্থিতি পেতে চেষ্টা করছি :
check=grep -ci 'text' file.sh
এবং আমি যে আউটপুট পেয়েছিলাম তা হল
No command '-ic' found
আমি পাইপ কমান্ড দিয়ে এটি করা উচিত?
আমি কয়েক দিন আগে বাশ শিখতে শুরু করি।
আমি grep
এই মত একটি চলক মধ্যে প্রকাশের একটি প্রস্থান স্থিতি পেতে চেষ্টা করছি :
check=grep -ci 'text' file.sh
এবং আমি যে আউটপুট পেয়েছিলাম তা হল
No command '-ic' found
আমি পাইপ কমান্ড দিয়ে এটি করা উচিত?
উত্তর:
আপনার আদেশ,
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
।
আপনার প্রশ্নটি অস্পষ্ট তবে আপনি যে কোডটি জমা দিয়েছেন তার উপর ভিত্তি করে মনে হচ্ছে আপনি ভেরিয়েবলটি কমান্ডের check
প্রস্থান স্থিতি সংরক্ষণ করতে চান grep
। এটি করার উপায়টি চালানো
grep -ci 'text' file.sh
check=$?
শেল থেকে কমান্ড চালানোর সময়, এর প্রস্থান স্থিতি বিশেষ শেল প্যারামিটারের মাধ্যমে উপলব্ধ করা হয় $?
।
এটি পসিক্স (ইউনিক্সের মতো অপারেটিং সিস্টেমগুলির মান) শেলটির জন্য তার স্পেসিফিকেশনে নথিভুক্ত করেছে এবং ব্যাশ বাস্তবায়ন বিশেষ প্যারামিটারের অধীনে নথিভুক্ত করা হয়েছে ।
যেহেতু আপনি একজন নতুন শিক্ষানবিস, তাই আমি দৃ strongly়ভাবে সুপারিশ করব যে আপনি ভাল বই এবং / অথবা অনলাইন টিউটোরিয়ালটি বেসিকগুলি পেতে শুরু করুন। স্ট্যাক এক্সচেঞ্জের সাইটগুলিতে বাহ্যিক সংস্থার সুপারিশগুলি নিরুৎসাহিত করা হয় তবে আমি লুনাথ এবং গ্রেগ্যাটিকের বাশ গাইডের পরামর্শ দিই ।
আপনি বাশকে check=grep
কমান্ডের কাছে যে পরিবেশে পরিবর্তন করে তা পরিবেশের পরিবর্তনশীল সেট করতে বলেছিলেন
-ci 'text' file.sh
কিন্তু ci
অস্তিত্ব নেই।
আমি বিশ্বাস করি যে আপনি এই আদেশটি ব্যাক-টিকগুলিতে বা ডলারের চিহ্নের আগে বন্ধনীগুলিতে আবদ্ধ করতে চেয়েছিলেন, যার মধ্যে দুটিই 'টেক্সট' ফাইলের (সংবেদনশীলতার ক্ষেত্রে) কত লাইনের সন্ধান পেয়েছিল তা গণনা করে:
check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)
এখন $check
কোনও মিল না থাকলে 0 বা কোনও ম্যাচ থাকলে ইতিবাচক হওয়া উচিত।
বিভ্রান্ত কেন আউটপুট পরীক্ষা করার সময় -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
একটি ভেরিয়েবলকে গ্রেপ কমান্ডের আউটপুট নির্ধারণের সঠিক উপায়টি হ'ল @ মন্টি-হার্ড উল্লেখ করা হয়েছে:
check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)
এই কমান্ডের প্রস্থান স্থিতিটি একটি ভেরিয়েবলের জন্য নির্ধারণ করার $?
পরে আপনাকে নীচের চিত্রের মতো কমান্ডটি প্রয়োগ করার পরে শেল প্যারামিটারটি ব্যবহার করতে হবে :
grep -ci 'text' file.sh
check=$?
echo $check
$?
কমান্ড শেষ হওয়ার পরে সঠিকভাবে পরীক্ষা করতে পারবেন ।