check 1 এবং $ 2 নাল কিনা তা কীভাবে পরীক্ষা করবেন?


40

আমি কিছু স্ক্রিপ্ট চালাচ্ছি যা স্ট্রিং আর্গুমেন্টটি পাস করে এবং অন্য বিবৃতিটি নীচের মতো দেখানো হলে আমি করতে চাই:

if [ $1 != '' ] && [ $2 != '' ]
then 
    do something.....

তবে এটি দেখানো হয়েছে Error too many argument। কেন?


আপনার 1 টি কমান্ড সরবরাহ করা উচিত যা আপনি স্ক্রিপ্টটি কল করেন এবং 2 সম্পূর্ণ আউটপুট।
লুসিও

2
আপনার ব্যবহার করা উচিত [[ ]]। অন্যথায় আপনাকে আপনার ভেরিয়েবলগুলি উদ্ধৃত করতে হবে।
ক্রিস্টোফ ডি ট্রয়ের

যদি $ 1 অস্তিত্ব না থাকে তবে $ 2 $ 1 হয়ে যায় যা $ 1 এবং both 2 উভয়কেই বাতিল বলে মনে করে এটি অপ্রাসঙ্গিক বলে মনে হয়।
WinEunuuchs2Unix

@ WinEunuuchs2Unix অগত্যা অপ্রাসঙ্গিক নয় - কিছু ক্ষেত্রে আপনি নিশ্চিত করতে চান যে যুক্তিগুলিতে ফাঁকা বা নাল স্ট্রিংয়ের পরিবর্তে আসলে কিছু আছে। $1স্ক্রিপ্ট ব্যবহারকারীর দ্বারা আনসেট করা বা নাল স্ট্রিংতে সেট করা যেতে পারে। কমান্ডের এই ক্রমটি বিবেচনা করুন: $ set '' barতারপরে echo "x${1}x";উভয় ভেরিয়েবল সেট করা আছে তবে তার মধ্যে একটি শূন্য।
সের্গেই কলডিয়াজনি

উত্তর:


55

-Z পরীক্ষাটি ব্যবহার করে দেখুন:

if [ -z "$1" ] && [ -z "$2" ]

মানুষের কাছ থেকে bash:

-z string
   True if the length of string is zero.

এটা আমার জন্য কাজ করে!
Pengisgood

এটি আকর্ষণীয় যে সর্বাধিক ভোট দেওয়া এবং স্বীকৃত উত্তর আসলে জিজ্ঞাসিত প্রশ্নের উত্তর দেয় না ।
মেহমেট

পোর্টেবল শেল স্ক্রিপ্টগুলি লেখার সময়, এই পতাকাটি যত্ন সহ ব্যবহার করা উচিত, কারণ কিছু বাণিজ্যিক ইউনিক্সে এই পতাকাটি ত্রুটিযুক্ত। সংযুক্ত উত্সের জন্য আমার উত্তর দেখুন।
সের্গেই কোলোডিয়াজনি

14

যেহেতু এটি ট্যাগ করা আছে bash, আমি প্রস্তাব দিই যে একটি বর্ধিত পরীক্ষার কনস্ট্রাক্ট ( [[...]]) ব্যবহার করুন এবং উদ্ধৃতিগুলি ভুলে যান:

if [[ -z $1 && -z $2 ]]; then
...

আপনি sh/ POSIX সামঞ্জস্যের জন্য না গেলে, ব্যবহার না করার কোনও কারণ নেই [[ ]]


3

নিম্নলিখিতগুলিও কাজ করে,

if [ "$1" == "" && "$2" == ""]; then
    echo NULL
fi

&&এবং অন্যান্য যৌক্তিক কমান্ড বিভাজক সর্বোত্তম অনুমোদিত নয় test। পরিবর্তে আপনাকে অন্যান্য পরীক্ষার -a
কাঠামো

3

উত্তরের পুরানো সংস্করণের জন্য, এই উত্তরের দ্বিতীয় অংশটি দেখুন। আপনি যদি বিশদ সম্পর্কে জানতে চান তবে পড়ুন

ইস্যু কারণ

প্রশ্নটিতে নিজেই জানা গেছে যে ওপি দেখেছে too many arguments error, যা পরীক্ষার সময় bashমনে হয় না:

$ [ $1 != '' ] && [ $2 != '' ]
bash: [: !=: unary operator expected

সঙ্গে /bin/shযা আসলে সিমলিঙ্ক হয় /bin/dashউবুন্টু উপর, ত্রুটি নিম্নরূপ প্রতিবেদন করার সময়:

$ sh
$ [ $1 != '' ] && [ $2 != '' ]
sh: 1: [: !=: unexpected operator

এবং একক /bin/testএছাড়াও:

$ /usr/bin/test $1 != ''  
/usr/bin/test: missing argument after ‘’

সিডিনোট: আপনি যদি ভাবছেন যে /usr/bin/testআমি কী এবং কেন আমি ব্যবহার করছি bashএবং shতাহলে আপনার জানা উচিত যে কমান্ডের [জন্য উলাম test, যা স্বতন্ত্র নির্বাহযোগ্য বা আরও সাধারণভাবে উপস্থিত রয়েছে - শেলটি অন্তর্নির্মিত হিসাবে যা প্রতিটি শেলটি প্রথমে ব্যবহার করবে । ifবিবৃতি হিসাবে , তারা কমান্ডের বহির্গমন মূর্তিগুলিতে কাজ করে, সুতরাং [এবং কেন testহ'ল আদেশগুলি, সমস্ত কিছুই সেই আদেশগুলির পক্ষে যুক্তিযুক্ত those এই কমান্ড-লাইন আর্গগুলির অনুপযুক্ত ক্রমটি ত্রুটির দিকে পরিচালিত করে।

বিষয়টিতে ফিরুন: এটি অস্পষ্ট যে কীভাবে ও সম্পর্কিত সম্পর্কিত ত্রুটি পেয়েছে। তবে, 3 টি ক্ষেত্রেই সমস্যাটি এক রকম - আনসেট ভেরিয়েবলটি খালি হিসাবে গণ্য হবে, সুতরাং শেলটি এই অনাবৃত ভেরিয়েবলগুলির সাথে যা দেখায় তা হ'ল

[ != '' ]

যা সিনট্যাক্স ভঙ্গ করে যা testবোঝে। কমান্ড-লাইন আর্গুমেন্টের অনুপযুক্ত অর্ডার সম্পর্কে আমি কি বলেছি মনে আছে? সুতরাং কেন উদ্ধৃতি গুরুত্বপূর্ণ। আসুন ডায়াগনস্টিক আউটপুট সক্ষম করুন এবং দেখুন যে শেলটি কার্যকর করে:

$ set -x
# throws error
$ [ $1 != '' ] && [ $2 != '' ] 
+ '[' '!=' '' ']'
bash: [: !=: unary operator expected
# no error
$ [ "$1" != '' ] && [ "$2" != '' ] || echo null vars
+ '[' '' '!=' '' ']'
+ echo null vars
null vars

আনসেট ভেরিয়েবল পরীক্ষা করার আরও ভাল উপায়

খুব ঘন ঘন দৃষ্টিভঙ্গি যা আপনি চারপাশে দেখতে পান তা হ'ল:

 if [ "x$var1" == "x"  ] && [ "x$var2" == "x"  ];                                                                
 then
     echo "both variables are null"
 fi

গিলসের উদ্ধৃতি দিতে :

["X $ 1" = "x"] এ, এক্স উপসর্গটি নিশ্চিত করেছে যে x "$ 1" সম্ভবত অপারেটরের মতো দেখতে পারে না এবং তাই শেলটি এই পরীক্ষাকে পার্স করতে পারে কেবল বাইনারি অপারেটর হিসাবে = ট্রিট করে।

সম্ভবত, এটি মোটামুটি বহনযোগ্য হওয়া উচিত যেহেতু আমি এগুলি /bin/shস্ক্রিপ্টগুলিতে দেখেছি । এটি হিসাবে হিসাবে একত্রিত করা যেতে পারে

if [ "x${var1}${var2}" == "x" ]; then
    ...
fi

অবশ্যই আমরা ব্যবহার করতে পারে -zপতাকা, তবে কিছু শাঁস রিসার্চ করতে হয়, বিশেষ করে ksh88 (অনুযায়ী অনুযায়ী স্টিফেন Chazelas ), এই পতাকা ত্রুটিপূর্ণ।

আরো দেখুন


খুব আকর্ষণীয় পদ্ধতির জন্য +1।
WinEunuuchs2 ইউনিক্স

করতে @ WinEunuuchs2Unix সম্পাদিত এটা এমনকি আরও বেশি আকর্ষণীয় :)
Sergiy Kolodyazhnyy

1

আমি মনে করি পোস্টটির শিরোনামটি সঠিক নয়, কারণ বার্তায় উদ্দেশ্য ছিল check 1 এবং $ 2 বাতিল নয় কিনা তা পরীক্ষা করা। প্রদত্ত উদাহরণটি কেবল কাজের জন্য quot 1 এবং $ 2 এ ডাবল উদ্ধৃতি অনুপস্থিত ছিল। স্ট্রিজের তুলনা করার সময় প্রসারিত করতে ভেরিয়েবলগুলি ডাবল কোটেড হতে হবে। তবে, $ 1 এবং $ 2 অস্তিত্ব আছে কিনা তা যাচাই করার জন্য $ 2 উপস্থিত রয়েছে কিনা তা যাচাই করার মতো, কারণ এটি যদি exist 1 না থাকে তবে তা বিদ্যমান থাকতে পারে না। এই ক্ষেত্রে 'if' কমান্ডেরও প্রয়োজন নেই, কারণ 'পরীক্ষা' সত্য / মিথ্যা প্রত্যাবর্তন করে এবং '&&' ব্যবহার করে 'তবে' যদি '0' / সত্য হয়:

[ "$2" != '' ] && commands...

সরল, -n (ননজারো) সহ:

[ -n "$2" ] && commands...

"$ 1 এবং $ 2 নাল কিনা তা পরীক্ষা করা" কোনও প্যারামিটার না থাকলে চেক করার মতো হবে:

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