ভেরিয়েবল শেলের একটি সংখ্যার সমান হলে কীভাবে পরীক্ষা করবেন


13

আমার কাছে এই শেল স্ক্রিপ্ট রয়েছে যা কাজ করছে না।

ইনপুট:

Server_Name=1
if [ $Server_Name=1 ]; then  
echo Server Name is 1  
else
echo Server Name is not 1
fi

আউটপুট:

Server Name is 1

তবে, যদি আমি পরিবর্তন করি Server_Name=2তবে আউটপুটটি হ'ল:

Server Name is 1

আমি যখন পরিবর্তন Server_Nameকরি 2, আমি এটি বলতে চাই : Server Name is 2.

আমি জানি এটা if [ $Server_Name=1 ];অংশ।

আমি কীভাবে এটি ঠিক করব?


যেমন ডেভিড নীচে নির্দেশ করেছেন, আপনাকে অবশ্যই সংখ্যার মানগুলি পরীক্ষা করতে "-eq" ব্যবহার করতে হবে। ত্রুটিগুলি এড়াতে আপনি একটি ফাঁকা পরিবর্তনশীলও পরীক্ষা করতে চাইতে পারেন; if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
মাইকবাবকক

উত্তর:


22

আপনার স্ক্রিপ্ট নির্দেশ করে যে আপনি স্ট্রিং তুলনা ব্যবহার করছেন।

ধরুন সার্ভারের নামটি কেবল সংখ্যার পরিবর্তে একটি স্ট্রিং হতে পারে।

জন্য স্ট্রিং তুলনা :
if [[ "$Server_Name" == 1 ]]; then

মন্তব্য:

  • চারপাশের ব্যবধান == একটি আবশ্যক
  • চারপাশে ব্যবধান করা = অবশ্যই আবশ্যক
    if [ $Server_Name=1 ]; then R

  • [[...]] কোনও পথের নাম বা প্রসারিত শব্দ [বা [এবং]] এর মধ্যে ঘটে না বলে ত্রুটিগুলি হ্রাস করে

  • "শব্দ" যে স্ট্রিং উদ্ধৃতি পছন্দ

জন্য পূর্ণসংখ্যা তুলনা :
if [[ "$Server_Name" -eq 1 ]]; then


অধিক তথ্য:


2
[[বাশ সিনট্যাক্স এবং ওপি শেল সম্পর্কে জিজ্ঞাসা করছিল, যেখানে এটি কাজ করবে না
gilad mayani


2
[ $Server_Name=1 ]

উদ্দেশ্যে হিসাবে কাজ করে না কারণ একক বন্ধনী মধ্যে সিনট্যাক্স বাশ জন্য বিশেষ নয়। যথারীতি, চলকটি $Server_Name1 দ্বারা প্রতিস্থাপিত হয়, সুতরাং সমস্ত পরীক্ষা ( [) কমান্ডটি দেখায় এটি একটি একক যুক্তি: স্ট্রিং 1=1। যেহেতু এই স্টিংয়ের শূন্য-দৈর্ঘ্য দৈর্ঘ্য নেই তাই পরীক্ষার সত্যটি ফিরে আসে ।

পসিক্স-কমপ্লায়েন্ট শেলগুলির জন্য, আপনি নিম্নলিখিত পরীক্ষার আদেশগুলি ব্যবহার করতে পারেন :

[ "$Server_Name" = 1 ]

চেকগুলি $Server_Nameস্ট্রিংয়ের সমান 1

[ "$Server_Name" -eq 1 ]

চেকগুলি সংখ্যার$Server_Name সমান , অর্থাত্ এটি স্ট্রিং তুলনার পরিবর্তে একটি সংখ্যাসূচক তুলনা করে। 1

দুটি কমান্ডের রিটার্ন মান পৃথক হবে, উদাহরণস্বরূপ, আপনি যদি সংজ্ঞা দেন তবে Server_Name=01। প্রথমটি মিথ্যা ফিরে আসবে, দ্বিতীয়টি সত্যে ফিরে আসবে।

মনে রাখবেন যে যদি সম্ভাবনাটি বিদ্যমান থাকে যে ভেরিয়েবলটি $Server_Nameঅপরিজ্ঞাত হয় তবে অবশ্যই এটি উদ্ধৃত করা উচিত বা পরীক্ষার সময় একটি ত্রুটি প্রদর্শিত হবে inv



0

সহজ উত্তর। আপনার কোডটি সঠিক - প্রায়। আপনি যে জিনিসটি হারিয়ে যাচ্ছেন তা হ'ল ফাঁকা স্থান ... (এবং ভাল কোনও অতিরিক্ত "=")

if [ $Server_Name=1 ]; then

সঠিকভাবে গণনা করা হবে না।

if [ $Server_Name == 1 ]; then  

তোমরা যা চাচ্ছ

এবং এখন স্ট্রিং বনাম সংখ্যা সম্পর্কে বিবৃতি। যখনই আপনি তুলনা অনুসন্ধান করছেন যখন / ঠিক-তে নয়, তবে == সর্বদা ঠিক থাকবে।

এবং আমি ধরে নিলাম আপনার কাছে সর্বদা একটি স্ট্রিং হিসাবে একটি সার্ভারের নাম রয়েছে, একটি সংখ্যা নয় - ডান? ;-)

আপনার কোডিং দৃur় শিক্ষানবিস জন্য শুভকামনা।

Ciao


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