আমি কীভাবে শেল স্ক্রিপ্ট লিখতে পারি যা কমান্ড আউটপুটটির ক্ষেত্রে একটি সংবেদনশীল সাবস্ট্রিং ম্যাচ করে?
bash
যার একটি সুপারসেটও হয়, UNIX মানsh
। আপনি এর মধ্যে একটি দেখে শুরু করতে পারেন: | 1 | | 2 | - কেবল আসল প্রসঙ্গটি কী তা জানতে পারে।
আমি কীভাবে শেল স্ক্রিপ্ট লিখতে পারি যা কমান্ড আউটপুটটির ক্ষেত্রে একটি সংবেদনশীল সাবস্ট্রিং ম্যাচ করে?
bash
যার একটি সুপারসেটও হয়, UNIX মানsh
। আপনি এর মধ্যে একটি দেখে শুরু করতে পারেন: | 1 | | 2 | - কেবল আসল প্রসঙ্গটি কী তা জানতে পারে।
উত্তর:
প্রথমে এখানে একটি সাধারণ উদাহরণ স্ক্রিপ্ট যা কেসকে উপেক্ষা করে না:
#!/bin/bash
if [ $(echo hello) == hello ]; then
echo it works
fi
ডানদিকে স্ট্রিং হ্যালো পরিবর্তন করার চেষ্টা করুন এবং এটি আর প্রতিধ্বনিত হওয়া উচিত নয় it works
। echo hello
আপনার পছন্দের আদেশটি প্রতিস্থাপনের চেষ্টা করুন । আপনি যদি কেসটিকে উপেক্ষা করতে চান এবং স্ট্রিংয়ের মধ্যে একটি লাইন ব্রেক নেই, তবে আপনি গ্রেপ ব্যবহার করতে পারেন:
#!/bin/bash
if echo Hello | grep -iqF hello; then
echo it works
fi
এখানে কীটি হ'ল আপনি একটি কমান্ড আউটপুটটি পাইপ করছেন grep
। if
এই ক্ষেত্রে, grep মধ্যে - বিবৃতি একটি পাইপলাইন মধ্যে ডানদিকের কমান্ডের প্রস্থান অবস্থা পরীক্ষা। গ্রেপ সাফল্যের সাথে প্রস্থান করে যদি এবং কোনও মিল খুঁজে পায় তবেই।
-i
, Grep বিকল্প ক্ষেত্রে উপেক্ষা করার বলছেন। বিকল্প নয় নির্গত আউটপুট এবং প্রথম খেলা শেষে প্রস্থান বলেছেন। বিকল্প একটি রেগুলার এক্সপ্রেশন একটি স্ট্রিং অপেক্ষা বরং যুক্তি চিকিত্সা বলল।-q
-F
মনে রাখবেন যে প্রথম উদাহরণটি ব্যবহার করে যা সরাসরি তুলনা এবং বিভিন্ন দরকারী অপারেটরকে অনুমতি দেয়। দ্বিতীয় ফর্মটি কেবল আদেশগুলি কার্যকর করে এবং তাদের প্রস্থান স্থিতি পরীক্ষা করে।[ expression ]
==
পসিক্স নয়। sh
নয় bash
সব লিনাক্স ভিত্তিক সিস্টেমে। ==
দ্বারা সমর্থিত নয় ash
(যার উপর sh
অনেকগুলি বিএসডি এবং ডেবিয়ান ডেরিভেটিভস অন্তত ভিত্তিক), বা posh
, এবং এর উদ্ধৃত প্রয়োজন zsh
। দ্বিগুণ করার কোনও মানে নেই =
। [
পরীক্ষার জন্য একটি আদেশ। এখানে অ্যাসাইনমেন্ট এবং তুলনার মধ্যে বিভ্রান্ত করার দরকার নেই। (( a == b ))
বনাম মধ্যে এটি ভিন্ন (( a = b))
। ব্যবহার ==
একটি স্ক্রিপ্ট দিয়ে শুরু হয় #! /bin/sh
ভুল। যদি আপনি ধরে নেন ksh
বা bash
সিনট্যাক্স করেন তবে #!
সেই অনুযায়ী আপডেট করুন ।
আপনি যদি শেল অপশনটি সেট করেন তবে আপনি bash
রেইগেক্স অপারেটরটি ব্যবহার করে স্থানীয়ভাবে কেস-সংবেদনশীল সাবস্ট্রিং মেলাতে =~
পারেন nocasematch
। উদাহরণ স্বরূপ
s1="hElLo WoRlD"
s2="LO"
shopt -s nocasematch
[[ $s1 =~ $s2 ]] && echo "match" || echo "no match"
match
s1="gOoDbYe WoRlD"
[[ $s1 =~ $s2 ]] && echo "match" || echo "no match"
no match
[[ XYZ == xyz ]] && echo "match"
=>match
ভেরিয়েবলের মান একটি কেস সংবেদনশীল স্ট্রিং সার্চ জন্য needle
ভেরিয়েবলের মান haystack
:
case "$haystack" in
*"$needle"*) echo "present";
*) echo "absent";
esac
কেস-সংবেদনশীল স্ট্রিং অনুসন্ধানের জন্য, উভয়কে একই কেসে রূপান্তর করুন।
uc_needle=$(printf %s "$needle" | tr '[:lower:]' '[:upper:]' ; echo .); uc_needle=${uc_needle%.}
uc_haystack=$(printf %s "$haystack" | tr '[:lower:]' '[:upper:]' ; echo .); uc_haystack=${uc_haystack%.}
case "$uc_haystack" in
*"$uc_needle"*) echo "present";;
*) echo "absent";;
esac
মনে রাখবেন যে tr
জিএনইউ কোর্টিলগুলি মাল্টিবাইট লোকেলগুলিকে সমর্থন করে না (যেমন ইউটিএফ -8)। মাল্টিবাইট লোকেলগুলি দিয়ে কাজ করতে, পরিবর্তে ওড়না ব্যবহার করুন। আপনি যদি খালি ব্যবহার করতে চলেছেন তবে আপনি এটিকে স্ট্রিং তুলনা করতে পারেন কেবল রূপান্তর নয়।
if awk 'BEGIN {exit !index(toupper(ARGV[2]), toupper(ARGV[1]))}' "$needle" "$haystack"; then
echo "present"
else
echo "absent"
fi
tr
Busybox থেকে সমর্থন করে না সিনট্যাক্স; আপনি পরিবর্তে ব্যবহার করতে পারেন । ব্যস্তবক্স অ-এএসসিআইআই লোকেলগুলি সমর্থন করে না।[:CLASS:]
tr a-z A-Z
ভার্সন (তবে শি নয়) সংস্করণ ৪০++ তে কেস রূপান্তরকরণের জন্য একটি অন্তর্নির্মিত বাক্য গঠন এবং স্ট্রিং মেলানোর জন্য একটি সহজ বাক্য গঠন রয়েছে।
if [[ "${haystack^^}" = *"${needle^^}"* ]]; then
echo "present"
else
echo "absent"
esac
printf | tr
আমার মাথা ঘিরে। যেখানে সম্ভব, আপনার আদেশগুলি কমপক্ষে রাখুন ... একটি ভেরিয়েবল ভি দেওয়া হলে আপনি একই জিনিসটি ব্যবহার করে সম্পন্ন করতে পারেন v=$(tr '[:lower:]' '[:upper:]' <<<$v)
। যাঁরা এটি আগে কখনও দেখেননি, তাদের <<<
জন্য মূলত এখানে "এখানে পরিবর্তনশীল" যেমন <<EOF
হ'ল ডকুমেন্টের ব্যবহার। আপনি একেবারে এটি করতে হবে না printf
বা echo
না।
<<<
অপারেটর রয়েছে: কেএস, বাশ, জেডএস, তবে সরল sh নয়। এটি printf
কীভাবে চলে তার দিক থেকে পাইপিংয়ের খুব কাছাকাছি : এখানে একই সংখ্যক কল রয়েছে fork
এবং execve
(ধরে নেওয়া যায় যে printf
এটি বিল্ট-ইন রয়েছে, যা বেশিরভাগ সাধারণ শেলগুলির ক্ষেত্রে রয়েছে); পার্থক্য হ'ল <<<
পাইপ ব্যবহার না করে অস্থায়ী ফাইল তৈরি করা। <<<
টাইপ করা সুবিধাজনক তবে পারফরম্যান্সের উন্নতি নয়।
grep -i
হতে পারে?