যদি [] (বর্গাকার বন্ধনী) এর থেকে "[:: অনেকগুলি যুক্তি" ত্রুটির অর্থ


211

নিম্নলিখিত বেস শেল ত্রুটির অর্থ এবং সমাধানের জন্য আমি কোনও সাধারণ সোজা সরল উত্স সংস্থান খুঁজে পাইনি, সুতরাং এটি অনুসন্ধানের পরে আমি যা পেয়েছি তা পোস্ট করছি।

ভূল:

-bash: [: too many arguments

Google- বন্ধুত্বপূর্ণ সংস্করণ: bash open square bracket colon too many arguments

প্রসঙ্গ: একটি সাধারণ তুলনামূলক অপারেটরের সমতুল্য সমান, ইত্যাদি ইত্যাদির সাথে একক বর্গাকার বন্ধনীগুলিতে যদি একটি শর্ত থাকে উদাহরণস্বরূপ:

VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
  # some action
fi 

1
এই নির্দিষ্ট ত্রুটিটি উত্পন্ন করার কোডটি কোথায়?
অ্যান্ডারসন গ্রিন

উত্তর:


353

যদি আপনার $VARIABLEস্প্রিং বা অন্যান্য বিশেষ অক্ষরযুক্ত স্ট্রিং হয় এবং একক বর্গাকার বন্ধনী ব্যবহৃত হয় (যা testকমান্ডের শর্টকাট ), তবে স্ট্রিংটি একাধিক শব্দের মধ্যে বিভক্ত হয়ে থাকতে পারে। এগুলির প্রত্যেককে পৃথক যুক্তি হিসাবে বিবেচনা করা হয়।

যাতে একটি ভেরিয়েবলকে অনেকগুলি আর্গুমেন্টে বিভক্ত করা হয় :

VARIABLE=$(/some/command);  
# returns "hello world"

if [ $VARIABLE == 0 ]; then
  # fails as if you wrote:
  # if [ hello world == 0 ]
fi 

স্পেস বা অন্যান্য বিশেষ অক্ষরযুক্ত স্ট্রিং রাখে এমন কোনও ফাংশন কলের ক্ষেত্রেও এটি একই হবে।


সহজ ফিক্স

ভেরিয়েবল আউটপুটটিকে ডাবল কোটে আবদ্ধ করুন, এটিকে একটি স্ট্রিং (সুতরাং একটি যুক্তি) হিসাবে থাকতে বাধ্য করুন। উদাহরণ স্বরূপ,

VARIABLE=$(/some/command);
if [ "$VARIABLE" == 0 ]; then
  # some action
fi 

যে হিসাবে সহজ। তবে নীচে "এছাড়াও সাবধান ... ... এ যান" যদি আপনি গ্যারান্টি নাও দিতে পারেন তবে আপনার ভেরিয়েবলটি খালি স্ট্রিং, বা একটি স্ট্রিং যা শ্বেতস্থান ছাড়া কিছুই থাকবে না nothing


অথবা, একটি বিকল্প ফিক্স হ'ল ডাবল স্কোয়ার বন্ধনী ব্যবহার করা (যা এর জন্য একটি শর্টকাটnew test কমান্ডের )।

এটি কেবলমাত্র ব্যাশে (এবং দৃশ্যত কর্ন এবং জেডএসে) উপস্থিত রয়েছে এবং তাই ডাকাডাকি শেলগুলির সাথে এটি উপযুক্ত নয় by /bin/sh ইত্যাদি

এর অর্থ কয়েকটি সিস্টেমে এটি কনসোল থেকে কাজ করতে পারে তবে অন্য কোথাও যেমন বলা হয় তখন নয়cron সবকিছু কীভাবে কনফিগার করা হয় তার উপর নির্ভর করে।

এটি দেখতে এটি দেখতে হবে:

VARIABLE=$(/some/command);
if [[ $VARIABLE == 0 ]]; then
  # some action
fi 

যদি আপনার কমান্ডে এর মতো ডাবল স্কোয়ার ব্র্যাকেট থাকে এবং আপনি লগগুলিতে ত্রুটি পেয়ে থাকেন তবে এটি কনসোল থেকে কাজ করে, [[এখানে প্রস্তাবিত বিকল্পের জন্য অদলবদল করার চেষ্টা করুন, বা আপনার স্ক্রিপ্টটি যা চালায় সেগুলি শুল্ক ব্যবহার করে যা [[ওরফে সমর্থন করে new test


এছাড়াও সাবধান [: unary operator expectedত্রুটি

যদি আপনি "অনেকগুলি যুক্তি" ত্রুটিটি দেখছেন, সম্ভাবনাগুলি আপনি অপ্রত্যাশিত আউটপুট সহ কোনও ফাংশন থেকে স্ট্রিং পাচ্ছেন। যদি খালি স্ট্রিং (বা সমস্ত সাদা স্থানের স্ট্রিং) পাওয়াও সম্ভব হয় তবে এটি উপরের "দ্রুত সমাধান" দিয়েও শূন্য আর্গুমেন্ট হিসাবে বিবেচিত হবে এবং এতে ব্যর্থ হবে[: unary operator expected

আপনি যদি অন্য ভাষাতে ব্যবহার করেন তবে এটি একই 'গ্যাচা' - আপনি কোনও ভেরিয়েবলের বিষয়বস্তুগুলি মূল্যায়নের আগে কোডটিতে কার্যকরভাবে মুদ্রিত হওয়ার আশা করেন না।

এখানে একটি উদাহরণ যা ত্রুটি [: too many argumentsএবং [: unary operator expectedত্রুটি উভয়ই প্রতিরোধ করে : আউটপুটটি খালি থাকলে (এই উদাহরণে 0) পুরোপুরি ডাবল উদ্ধৃতি দিয়ে প্রতিস্থাপন করা :

VARIABLE=$(/some/command);
if [ "${VARIABLE:-0}" == 0 ]; then
  # some action
fi 

(এখানে, AR ভারিবেল 0 বা ফাঁকা থাকলে ক্রিয়াটি ঘটবে Natural স্বাভাবিকভাবে, ভিন্ন আচরণ চাইলে আপনার 0 (ডিফল্ট মান )টিকে আলাদা ডিফল্ট মানে পরিবর্তন করা উচিত)


চূড়ান্ত দ্রষ্টব্য: যেহেতু [একটি শর্টকাট testতাই উপরের সমস্তগুলি ত্রুটির জন্যও সত্য test: too many arguments(এবং এটিও test: unary operator expected)


আরও ভাল উপায় হ'লi=$(some_command); i=$((i)); if [ "$i" == 0 ] ...
জো সো

1
আমি একটি সমস্যার মুখোমুখি হয়েছি যখন টার্মিনালের মাধ্যমে মৃত্যুদন্ড কার্যকর করার সময় শশ্রিপ্ট বিএএসএইচ ব্যবহার করে ঠিকঠাক চলছিল, কিন্তু যখন ক্রন্টাবের মাধ্যমে মৃত্যুদন্ড কার্যকর করা হয়েছিল, তখন এইরকম ব্যর্থতা ছিল এবং পোস্টফিক্সের মাধ্যমে স্থানীয় ইমেল প্রেরণ করে, এই ত্রুটিটি অবহিত করে আমি বুঝতে পারি যে সেখানে ছিল একটি ভেরিয়েবলের জন্য একটি আইএফ যাতে বিশেষ অক্ষর ছিল। ডাবল উক্তি আমার জীবন বাঁচায়। ধন্যবাদ :)!
ivanleoncz

13

এই ত্রুটিটি পেয়ে কেবল এই পোস্টটিতে কেবল চাপ দেওয়া হয়েছে, দুটি ভেরিয়েবল উভয়ই ফাঁকা (বা খালি নয়) পরীক্ষা করার চেষ্টা করছেন । এটি একটি যৌগিক তুলনা হিসাবে প্রমাণিত হয় - 7.3। অন্যান্য তুলনা অপারেটর - উন্নত বাশ-স্ক্রিপ্টিং গাইড ; এবং আমি ভেবেছিলাম যে আমার নিম্নলিখিতগুলি দ্রষ্টব্য:

  • আমি -eভাবছিলাম এটির অর্থ প্রথমে "খালি"; তবে এর অর্থ "ফাইল বিদ্যমান" - -zখালি ভেরিয়েবল (স্ট্রিং) পরীক্ষার জন্য ব্যবহার করুন
  • স্ট্রিং ভেরিয়েবলের উদ্ধৃতি দেওয়া দরকার
  • যৌগিক যৌক্তিক এবং তুলনার জন্য, হয়:
    • দুটি testএবং &&তাদের ব্যবহার করুন:[ ... ] && [ ... ]
    • বা -aএকক মধ্যে অপারেটর ব্যবহার test:[ ... -a ... ]

এখানে একটি ওয়ার্কিং কমান্ড (একটি ডিরেক্টরিতে সমস্ত txt ফাইল অনুসন্ধান করা এবং যে grepদুটি শব্দ দুটি রয়েছে তা খুঁজে বের করে):

find /usr/share/doc -name '*.txt' | while read file; do \
  a1=$(grep -H "description" $file); \
  a2=$(grep -H "changes" $file); \
  [ ! -z "$a1" -a ! -z "$a2"  ] && echo -e "$a1 \n $a2" ; \
done

12 আগস্ট 2013 সম্পাদনা করুন: সম্পর্কিত সমস্যা নোট:

মনে রাখবেন যে যখন সর্বোত্তম সাথে STRING সমতা পরীক্ষণ test(একক বর্গাকার বন্ধনী [), আপনি হবে "সমান" অপারেটর, যা এই ক্ষেত্রে একটি একক হয় মধ্যে একটি স্থান আছে "সমান" =চিহ্ন (যদিও দুই সমান 'লক্ষণ ==সমতা হিসেবে গ্রহণ করা হবে বলে মনে হচ্ছে অপারেটরও)। সুতরাং, এটি ব্যর্থ (নিঃশব্দে):

$ if [ "1"=="" ] ; then echo A; else echo B; fi 
A
$ if [ "1"="" ] ; then echo A; else echo B; fi 
A
$ if [ "1"="" ] && [ "1"="1" ] ; then echo A; else echo B; fi 
A
$ if [ "1"=="" ] && [ "1"=="1" ] ; then echo A; else echo B; fi 
A

... তবে স্পেস যুক্ত করুন - এবং সমস্ত ভাল দেখাচ্ছে:

$ if [ "1" = "" ] ; then echo A; else echo B; fi 
B
$ if [ "1" == "" ] ; then echo A; else echo B; fi 
B
$ if [ "1" = "" -a "1" = "1" ] ; then echo A; else echo B; fi 
B
$ if [ "1" == "" -a "1" == "1" ] ; then echo A; else echo B; fi 
B

আপনি একটি বাশ শেল উদাহরণ প্রদান করতে পারেন ((A || B) && C)?
jww

দয়া করে প্রশ্নটি 3826425 এবং 14964805
স্প্লেইসান

এটি সত্যিকার অর্থে কোনও উত্তরের মতো কার্যকর নয় কারণ এটি আপনাকে স্কোয়ার বন্ধনীগুলির মধ্যে সম্পূর্ণ কমান্ডটি কীভাবে অন্তর্ভুক্ত রাখতে হবে তা বোঝায় না, উদাহরণস্বরূপ একটি লুপ থাকলে এটি প্রয়োজন।
টিমোথি সোয়ান

5

আপনি যদি সমস্ত যুক্তির জন্য পরীক্ষা করার চেষ্টা করেন তবে আপনি যে ত্রুটি [: too many argumentsবা [: a: binary operator expectedত্রুটিগুলি পেতে পারেন তা অন্য একটি দৃশ্য"$@"

if [ -z "$@" ]
then
    echo "Argument required."
fi

আপনি কল করলে foo.shবা এটি সঠিকভাবে কাজ করে foo.sh arg1। তবে আপনি যদি একাধিক আরগগুলি পছন্দ করেন তবে আপনি foo.sh arg1 arg2ত্রুটি পাবেন। এটি প্রসারিত হচ্ছে কারণ এটি[ -z arg1 arg2 ] বৈধ বাক্য গঠন নয়।

যুক্তিগুলির অস্তিত্বের জন্য যাচাই করার সঠিক উপায় হ'ল [ "$#" -eq 0 ]। ( $#আর্গুমেন্ট সংখ্যা)।


2

কিছু সময় আপনি যদি দুর্ঘটনাক্রমে কীবোর্ডটি স্পর্শ করেন এবং কোনও স্থান সরিয়ে ফেলেন।

if [ "$myvar" = "something"]; then
    do something
fi

এই ত্রুটি বার্তাকে ট্রিগার করবে। ']' এর আগে স্থানটি নোট করুন।


1
আমি মনে করি যে ফলাফলটি একটি ভিন্ন সিনট্যাক্স ত্রুটির ক্ষেত্রে যেমন: 21 লাইন: [: অনুপস্থিত `] '
জো হোলোয়

1

আমার স্ক্রিপ্টগুলির সাথে আমারও একই সমস্যা ছিল। তবে যখন আমি কিছু পরিবর্তন করেছি তখন এটি আমার পক্ষে কাজ করে। আমি এটি পছন্দ করেছি: -

export k=$(date "+%k");
if [ $k -ge 16 ] 
    then exit 0; 
else 
    echo "good job for nothing"; 
fi;

এইভাবে আমি আমার সমস্যার সমাধান করেছি। আশা করি এটি আপনার জন্যও সহায়ক হবে।

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