উত্তরের পুরানো সংস্করণের জন্য, এই উত্তরের দ্বিতীয় অংশটি দেখুন। আপনি যদি বিশদ সম্পর্কে জানতে চান তবে পড়ুন
ইস্যু কারণ
প্রশ্নটিতে নিজেই জানা গেছে যে ওপি দেখেছে 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 ), এই পতাকা ত্রুটিপূর্ণ।
আরো দেখুন