শর্ত থাকলে বাশে "ইউনিারি অপারেটর প্রত্যাশিত" ত্রুটি


225

আমি এটিতে কী ভুল আছে তা বের করার চেষ্টা করেছি তবে এটি ঠিক বুঝতে পারি না ..

এই অংশটি একটি ত্রুটি পেয়েছে বলে মনে হচ্ছে ..

elif [ $operation = "man" ]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [ -z $aug1 ]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

আমি এই ত্রুটি পেয়েছি:

calc_1.2: line 75: [: =: unary operator expected

4
আমি মনে করি if75 লাইনে আপনার বিবৃতিতে একটি দরকার fi
স্টিভ

7
সন্দেহ হলে, উদ্ধৃতি ভারস।
কুলা

9
@ কুলা, 'সর্বদা' উদ্ধৃতি ভারগুলি।
কাজিনকোচেন

উত্তর:


480

আপনি যদি জানেন যে আপনি সর্বদা ব্যাশ ব্যবহার করতে যাচ্ছেন [[ ... ]]তবে পিক্স-সামঞ্জস্যপূর্ণ একক বন্ধনী সংস্করণের পরিবর্তে সর্বদা ডাবল বন্ধনী শর্তসাপেক্ষ যৌগ কমান্ড ব্যবহার করা আরও সহজ [ ... ]। একটি [[ ... ]]যৌগের ভিতরে , শব্দ-বিভক্তকরণ এবং পথের নাম প্রসার শব্দগুলিতে প্রয়োগ হয় না, তাই আপনি নির্ভর করতে পারেন

if [[ $aug1 == "and" ]];

$aug1স্ট্রিংয়ের সাথে মানটির তুলনা করতে and

আপনি যদি ব্যবহার করেন তবে [ ... ]আপনার সর্বদা এই জাতীয় উদ্ধৃতি ভেরিয়েবলগুলি দ্বিগুণ করতে হবে:

if [ "$aug1" = "and" ];

আপনি যদি ভেরিয়েবল প্রসারকে উদ্ধৃত করেন না এবং ভেরিয়েবল অপরিজ্ঞাত বা খালি হয় তবে এটি অপরাধের দৃশ্য থেকে অদৃশ্য হয়ে যায়, কেবল রেখে যায়

if [ = "and" ]; 

যা বৈধ বাক্য গঠন নয়। (এটি যদি $aug1সাদা স্থান বা শেল মেটাচার্যাক্টর অন্তর্ভুক্ত করে তবে এটি একটি পৃথক ত্রুটি বার্তার সাথে ব্যর্থ হবে ))

আধুনিক [[অপারেটরটিতে নিয়মিত এক্সপ্রেশন ম্যাচিং সহ আরও অনেক দুর্দান্ত বৈশিষ্ট্য রয়েছে।


9
"আধুনিক"? [[ সর্বদা বাশে ছিল না? এটি বিশ বছরেরও বেশি সময় ধরে কর্ন শেলের মধ্যে রয়েছে, এবং প্রাক-তারিখের বাশ। (আপনি যদিও বলতে চাইছেন তা আমি জানি)
সিডারে

31

এটি খুঁজে পেতে আমাকে কিছুক্ষণ সময় নিয়েছে তবে মনে রাখবেন যে আপনার যদি ব্যবধান ত্রুটি থাকে তবে আপনিও একই ত্রুটি পাবেন:

[: =: unary operator expected

সঠিক:

if [ "$APP_ENV" = "staging" ]

বনাম

if ["$APP_ENV" = "staging" ]

সর্বদা হিসাবে -xডিবাগ ভেরিয়েবল নির্ধারণ এগুলি খুঁজে পেতে সহায়তা করে:

set -x

কেউ একটি বিল্ড স্ক্রিপ্টে আমার কাছে এই বাগটি ছড়িয়ে দিয়েছেন। কিছু সময় বাঁচিয়েছি, ধন্যবাদ!
কাইল

8

বিবৃতিতে $aug1এটি ব্যবহারের আগে একটি মান নির্ধারণের চেষ্টা করুন if[]; ত্রুটি বার্তা পরে অদৃশ্য হয়ে যাবে।


0

তুমি বল ... :

এলিফ [$ অপারেশন = "ম্যান"]; তারপরে যদি [ug aug1 = "যোগ"]; তারপরে # <- লাইন 75 প্রতিধ্বনি "ম্যান পেজ এর জন্য: যোগ করুন" প্রতিধ্বনি "" প্রতিধ্বনি "সিন্ট্যাক্স: [সংখ্যা 1] [সংখ্যা 2]" প্রতিধ্বনি "" প্রতিধ্বনি "বর্ণনা:" ইকো "একসাথে দুটি পৃথক সংখ্যা যুক্ত করুন। প্রতিধ্বনি "" প্রতিধ্বনি "তথ্য:" প্রতিধ্বনি "ভি 1.0" ইকো "" এলিফ [-z $ অগ 1] এ যুক্ত; তারপরে প্রতিধ্বনি করুন "ম্যান পৃষ্ঠাটি পড়ার জন্য দয়া করে একটি আদেশ উল্লেখ করুন।" অন্য প্রতিধ্বনি "এই আদেশের জন্য কোনও ম্যানুয়াল পৃষ্ঠা নেই" " ফাই

আমি মনে করি এটি ঠিক স্থান ... এইভাবে করুন:

elif [$operation = "man"]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [-z $aug1]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

-11

আপনি ভেরিয়েবলের জন্য একটি ডিফল্ট মানও সেট করতে পারেন, সুতরাং আপনার দুটি "[" ব্যবহার করার দরকার নেই, এটির পরিবর্তে দুটি প্রক্রিয়া ("[" আসলে একটি প্রোগ্রাম)) to

এটি এই বাক্য গঠন দ্বারা যায়: $ AR বৈচিত্র্য: -ডিফল্ট}

পুরো বিষয়টি এমনভাবে ভাবতে হবে যে এই "ডিফল্ট" মানটি একটি "বৈধ" মান / সামগ্রী থেকে আলাদা।

যদি কোনও কারণে এটি সম্ভব না হয় তবে আপনাকে সম্ভবত "যদি [-z $ পরিবর্তনশীল]" এর লাইনের সাথে আদৌ কোনও মান আছে কিনা তা যাচাই করার মতো একটি পদক্ষেপ যুক্ত করতে হবে; তারপরে "চলকটি পূরণ করা দরকার" "প্রতিধ্বনি করুন, বা" যদি [! -z $ পরিবর্তনীয়]; তবে # প্রতিটি জিনিস ঠিক আছে, স্ক্রিপ্টের বাকী অংশটি নিয়ে এগিয়ে যান "।


3
[[দুটি প্রক্রিয়া তৈরি করছে না, এটি একটি শেল বিল্টিন (এবং [এটি একটি বাশ বিল্টিনও)। [[এর থেকে পৃথক [ [, যা দ্বিতীয়টিকে [স্ট্রিং হিসাবে বিবেচনা করে
ব্যবহারকারীর 123444555621
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.