বাশ স্ক্রিপ্টিং: যদি আর্গুমেন্টগুলি এই স্ট্রিংয়ের সমান হয় তবে এই স্ট্রিংয়ের মতো ভেরিয়েবল নির্ধারণ করুন


225

আমি কিছু বাশ স্ক্রিপ্ট করছি এবং এখন আমি একটি ভেরিয়েবল কল পেয়েছি sourceএবং একটি অ্যারে কল পেয়েছি samples, এর মতো:

source='country'
samples=(US Canada Mexico...)

যেহেতু আমি উত্সের সংখ্যাটি প্রসারিত করতে চাই (এবং প্রতিটি উত্সের নিজস্ব নমুনা রয়েছে) এটি করার জন্য আমি কিছু যুক্তি যুক্ত করার চেষ্টা করেছি। আমি এটি চেষ্টা করেছি:

source=""
samples=("")
if [ $1="country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
   echo "try again"
fi

তবে আমি যখন আমার স্ক্রিপ্টটি চালিয়েছিলাম source countries.sh countryএটি কার্যকর হয়নি। আমি কি ভুল করছি?


2
এটা কিভাবে কাজ করে না? আপনি যখন এটি চালান আপনি একটি ত্রুটি পান, বা এটি "আবার চেষ্টা করুন", বা অন্য কিছু বলে?
অশুভ অট্টো

2
হ্যাঁ, আপনি ভাবতে পারেন 'প্রশ্নটি খুব সোজা'। তবে আপনি কিছুক্ষণ ধরে এটি সম্পর্কে ভাবছেন। প্রয়োজনীয় ফলাফলগুলি এবং যে কোনও ত্রুটি বার্তাগুলি আপনাকে অন্তর্ভুক্ত করতে দয়া করে আপনার প্রশ্ন সম্পাদনা বিবেচনা করুন। আসলে কিছু চেষ্টা এবং প্রশ্নের ভাল ফর্ম্যাট করার জন্য +1। শুভকামনা
শেল্টার

এই কোডটি প্রস্তাবিত এবং গৃহীত সমাধানের মতো কেন? এটি বিভ্রান্তিকর ... আমি অনুমান করছি প্রাথমিক প্রশ্নটি খোলার বন্ধনীটির পরে এবং যদি বাক্যটির বন্ধনী বন্ধনীর আগে ফাঁকা স্থান ছিল না?
স্টেফ

6
@ স্টেফ যদি আপনি নিবিড়ভাবে দেখুন, $1="country"বনাম$1 = "country"
উইল করুন

উত্তর:


412

স্পেস সম্পর্কে ভুলবেন না:

source=""
samples=("")
if [ $1 = "country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi

121
আমি বিশ্বাস করতে পারি না যে আমি এটিতে তিন ঘন্টা ব্যয় করেছি এবং কেবলমাত্র জায়গাগুলির সমস্যা ছিল !!!! ... ধন্যবাদ @ অ্যালেক্স
আলেজান্দ্রো

1
আপনি samples="US Canada Mexico..."অ্যারে তৈরির আগে পরিচয় করিয়ে দেওয়ার পরে কেন ব্যবহার করবেন samples=(US Canada Mexico...)?
ব্যবহারকারী অজানা

10
বাম দিকের ভেরিয়েবলটি একটি খালি স্ট্রিং ছিল তখন আমি এটি নিয়ে ইস্যুতে দৌড়েছি। ফিক্স ছিল if [ "$1" = "country" ]; then
অ্যান্ড্রুব

8
ঠিক আছে এটা। সর্বাধিক পুরানো এখনও এখনও ব্যবহৃত কমান্ড ভাষা ব্যবহার করার জন্য বাশ আনুষ্ঠানিকভাবে আমার ভোট পেয়েছে। সিনট্যাক্সটি এতটা বেহায়া হিসাবে বেদনাদায়ক is সত্যিই এটির জন্য কোনও স্থান নেই 2016+। @ সিস্টেমে লেখক: আপনি কি দয়া করে আপনার পরবর্তী প্রকল্পটি "এমন একটি লিনাক্স শেল তৈরি করতে পারবেন যা চুষে না"? আমি তোমাকে টাকা নিক্ষেপ করব।
মাসি

3
@ ম্যাসি কখনও কখনও আমি ইউনিক্সের মূল অভিপ্রায়টি "অস্পষ্টতার মাধ্যমে কাজের সুরক্ষা" বলে মনে করি। যদি সরঞ্জামগুলি ব্যবহারের জন্য রহস্যজনক ছিল, বোঝা শক্ত ছিল এবং সাধারণত অভ্যন্তরীণ জ্ঞান ছাড়াই গ্রেড ওয়াশডের নাগালের বাইরে মাস্টার থেকে পাদওয়ানের কাছে হস্তান্তর করা হয়, এটি নিশ্চিত করে যে "জ্ঞাত" তাদের জন্য সর্বদা কাজ করবে। এই দর্শনটি পুরো "আরএফসি" নির্মাণে, এবং ম্যান ডকুমেন্টগুলিতে ব্যবহৃত ফুলের ভাষাতেই স্পষ্ট হয়, যা সরঞ্জামগুলি কীভাবে ব্যবহার করতে হয় তা প্রযুক্তিগতভাবে আপনাকে জানায়, কেবলমাত্র সরঞ্জামগুলি নথিভুক্ত করার প্রয়োজনীয়তা পূরণ করার জন্য সেখানে ছিল। সামান্য পরিবর্তন হয়েছে।
অবিচ্ছিন্ন

184

আপনি বাশের মধ্যে স্ট্রিং তুলনার জন্য "=" বা "==" অপারেটরগুলি ব্যবহার করতে পারেন। গুরুত্বপূর্ণ উপাদানটি হল বন্ধনীগুলির মধ্যে ব্যবধান ac যথোপযুক্ত পদ্ধতিটি হ'ল বন্ধনীগুলির মধ্যে স্পেসিং থাকে এবং অপারেটরগুলি চারপাশে ফাঁকা স্থান ধারণ করে। কিছু ক্ষেত্রে বিভিন্ন সংমিশ্রণ কাজ করে; তবে, নিম্নলিখিতটি বিশ্বজনীন উদাহরণ হিসাবে বিবেচিত।

if [ "$1" == "something" ]; then     ## GOOD

if [ "$1" = "something" ]; then      ## GOOD

if [ "$1"="something" ]; then        ## BAD (operator spacing)

if ["$1" == "something"]; then       ## BAD (bracket spacing)

এছাড়াও, নোট ডাবল বন্ধনীগুলি একক বন্ধনীগুলির তুলনায় কিছুটা আলাদাভাবে পরিচালনা করা হয় ...

if [[ $a == z* ]]; then   # True if $a starts with a "z" (pattern matching).
if [[ $a == "z*" ]]; then # True if $a is equal to z* (literal matching).

if [ $a == z* ]; then     # File globbing and word splitting take place.
if [ "$a" == "z*" ]; then # True if $a is equal to z* (literal matching).

আমি আশা করি এটি সাহায্য করবে!


12

দেখে মনে হচ্ছে আপনি আপনার বাশ স্ক্রিপ্টে কমান্ডলাইন যুক্তিগুলি পার্স করার চেষ্টা করছেন। আমি সম্প্রতি এটি অনুসন্ধান করেছি। আমি নিম্নলিখিতগুলি পেরিয়ে এসেছি যা আমি মনে করি যুক্তিগুলি বিশ্লেষণে আপনাকে সহায়তা করবে:

http://rsalveti.wordpress.com/2007/04/03/bash-parsing-arguments-with-getopts/

আমি নীচে স্নিপেট টিএলটি হিসাবে যুক্ত করেছি;

#using : after a switch variable means it requires some input (ie, t: requires something after t to validate while h requires nothing.
while getopts ht:r:p:v OPTION
do
     case $OPTION in
         h)
             usage
             exit 1
             ;;
         t)
             TEST=$OPTARG
             ;;
         r)
             SERVER=$OPTARG
             ;;
         p)
             PASSWD=$OPTARG
             ;;
         v)
             VERBOSE=1
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

if [[ -z $TEST ]] || [[ -z $SERVER ]] || [[ -z $PASSWD ]]
then
     usage
     exit 1
fi

./script.sh -t পরীক্ষা -r সার্ভার -p পাসওয়ার্ড -v

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