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