যদি শর্তে বন্ধনী: আমি কেন সাদা স্থান ব্যতীত সিনট্যাক্স ত্রুটি পাচ্ছি?


17

আমি যখন নীচের স্ক্রিপ্টটি দু'দিন পিছনে সরে যাচ্ছি তখন যখন স্ক্রিপ্টটি বছরের দু'দিন শুরু হয় এবং প্রতি মাসের প্রথম এবং দ্বিতীয় দিন পরীক্ষা করে দুটি দিন পিছনে সরে যায়।

if [$month="01"] && [$day="01"];
then
    date="$last_month/$yes_day/$last_year"
      fulldate="$last_month/$yes_day/$last_year"
else
if [$month="01"] && [$day="02"];
then
         date="$last_month/$yes_day/$last_year"
      fulldate="$last_month/$yes_day/$last_year"
else
   if [ $day = "01" ];
then
    date="$last_month/$yes_day/$year"
            fulldate="$year$last_month$yes_day"
else
        if [ $day = "02" ];
then
    date="$last_month/$yes_day/$year"
        fulldate="$year$last_month$yes_day"
else
    date="$month/$yes_day/$year"
        fulldate="$year$month$yes_day"
                fi
               fi
              fi
fi

তবে আমার খারাপটি নীচের ত্রুটি বার্তাটি পাচ্ছে

Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found

1
প্রদত্ত উত্তরগুলি সঠিক; আপনার পরে সাদা জায়গা প্রয়োজন [। অতিরিক্তভাবে, elifবিবৃতিটি দেখুন; এটি আপনাকে জিনিস পরিষ্কার করতে সহায়তা করবে। এছাড়াও, যদি বিবৃতিগুলি প্রয়োজনীয় না হয় তবে সেমিকোলনগুলিও ভুল নয়, কেবল অদ্ভুত।
শন জে গফ

@ শনজেজ.ফফ আপনি পরবর্তী লাইন ( if [ ... ]; then) এর সাথে একমত পোষন করেন তবে এগুলি প্রয়োজনীয় so
স্বর্ণলোকস

@ গোল্ডিলোকস, হ্যাঁ, এটি আমার পছন্দসই স্টাইল। এটি অস্বাভাবিক হওয়ার কারণ হ'ল তিনি তা করছেন না।
শন জে গফ

উত্তর:


27

[না কোনও মেটাচ্যারাক্টর এবং না কন্ট্রোল অপারেটর (এমনকি কোনও সংরক্ষিত শব্দ নয়; একইভাবে ]) এর চারপাশে সাদা স্থান প্রয়োজন। তা না হলে শেল কমান্ড "সূচিত" [01=01]পরিবর্তে কমান্ডের [পৃথক পরামিতি সঙ্গে 01, =, 01, এবং ]। প্রতিটি অপারেটর এবং অপারেণ্ডের [কমান্ডের জন্য পৃথক যুক্তি হওয়া দরকার , তাই অপারেটরগুলির চারপাশেও সাদা স্থান প্রয়োজন।

if [ "$month" = "01" ]

[$month="01"] এর মধ্যে যে কোনও অক্ষরের সাথে মেলে একটি ওয়াইল্ডকার্ড প্যাটার্ন $month বা এর"01 । যদি এটি কোনও কিছুর সাথে মেলে না, তবে এটি একা রয়ে গেছে।

বন্ধ বন্ধনীটির পরে যদি একটি সেমিকোলন থাকে তবে এর আগে আপনার কোনও স্থানের দরকার নেই, কারণ সেমিকোলন সর্বদা একটি পৃথক টোকেনের অংশ is

if [ "$month" = "01" ]; then

একই বাশের (এবং ksh এর এবং zsh এর) ডাবল বন্ধনী সিনট্যাক্সের জন্য যায়।

একের অধিক শর্ত

শর্তগুলি একত্রিত করার দুটি উপায় রয়েছে:

  1. মধ্যে [

  2. বা পৃথক [কমান্ডের সাথে মিলিত&&||

বন্ধনীগুলির সাথে গ্রুপিং করা সম্ভবত এটির মধ্যে সহজ [

if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or

if [ "$month" = "01" ] && [ "$day" = "01" ]

এটি অবিশ্বাস্য হওয়ায় প্রথমটিকে এড়ানো উচিত (উদাহরণস্বরূপ চেষ্টা করুন month='!')। অদ্ভুত পরিবর্তনশীল সামগ্রীর সমস্যাগুলি প্রথমে নিরাপদ স্ট্রিং (যদি থাকে তবে) ব্যবহার করে এড়ানো যায়; অথবা ব্যবহার [[/ ]]পরিবর্তে [/ ]:

if [ "01" = "$month" -a "01" = "$day" ]

যদি আমরা দুটি শর্তের সাথে কীভাবে মিল করতে পারি, যেমন মাসের মান == দিনের মান যদি [$ মাস = = 01 "] && [$ দিন =" 01 "]; 01 && 01 টি সত্য আশা করছি তবে শর্তাবলী নীচে মুদ্রণ করুন বা অন্য বিবৃতিতে যান
কুমার 1

আমি আশাশঙ্গনাহল্লি আমার উত্তরটি প্রসারিত করেছি।
হউক লেগেছে

1
[কখন -a/ -oব্যবহার করা হয় না তা পসিক্স অনুগত শেলগুলির সাথে সর্বদা নির্ভরযোগ্য। -a/-oওভার ব্যবহারে কোনও লাভ নেই &&/||। আমি অবশ্যই এর ব্যবহারকে নিরুৎসাহিত করব। দ্রষ্টব্য যে [[পসিক্স নয়।
স্টাফেন চেজেলাস

4

এটি লেখার আর একটি উপায়:

case $month:$day in
  (01:0[12])
    date="$last_month/$yes_day/$last_year"
    fulldate="$last_month/$yes_day/$last_year"
    ;;
  (*:0[12])
    date="$last_month/$yes_day/$year"
    fulldate="$year$last_month$yes_day"
    ;;
  (*)
    date="$month/$yes_day/$year"
    fulldate="$year$month$yes_day"
esac

1
caseবিবৃতি জন্য +1 । আপনার যদি একাধিক থাকে তবে elifআপনার সম্ভবত ব্যবহার করা উচিত case
HalosGhost

-1

সুতরাং, এটি আপনার উত্তর:

if [ $var1 == $var2 ];
 then
    echo "bla bla"
fi

সুতরাং আপনাকে অবশ্যই বর্গাকার বন্ধনী এবং ভেরিয়েবল / মানের মধ্যে "স্পেস" রাখতে হবে।


না আমি পছন্দ করি না, কারণ আমি যখন স্ক্রিপ্টটি দু'দিন আগে সরিয়ে নিয়ে যেতে বলেছিলাম যখন স্ক্রিপ্টটি বছরের দু'দিন শুরু হয় এবং প্রতি মাসের প্রথম এবং দ্বিতীয় দিন পরীক্ষা করে দেখি এবং দু'দিন পিছনে সরে যায় মানে এখানে যদি [$ মাস = = 01 "] && [$ দিন = "01"] আমরা মনে করি মাস "01" এবং প্রথম দিন "01" এর সাথে মিলে যায়, তারপর চলে যান বা অন্য অবস্থায় চলে যান
কুমার 1

1
@ আশোকসঙ্ঘনাহল্লি: আমি জানি না এটি কীভাবে সম্পর্কিত, তবে আপনার যদি অবস্থাটি কাজ করছে না কারণ আপনার বর্গাকার বন্ধনী এবং মানের মধ্যে "ফাঁকা জায়গা" নেই
নেভেন

@ আশোকসঙ্ঘনাহল্লি আপনার দক্ষতার স্তরের লোকদের পক্ষে কমপক্ষে ইঙ্গিত দেওয়ার পরেও স্পষ্টতই ভাল বোঝার লোকদের সংশোধনের বিষয়ে বিতর্ক করা ভাল নয় good যদি আপনার অনুমানগুলি ঠিক থাকে তবে আপনাকে এখানে জিজ্ঞাসা করতে হবে না, তাই না?
হউক লেগেইন

4
অ-উদ্ধৃত ভেরিয়েবল এবং ==মানের পরিবর্তে ব্যবহারের জন্য -1 =
স্টাফেন চেজেলাস

2
প্রশ্ন বাশ বাঁধা হয় না। মধ্যে সমতা তুলনা অপারেটর মান [ওরফে testকমান্ড হয় =[যদি পরীক্ষার জন্য, এটি কোনও অ্যাসাইনমেন্ট না করে যাতে ক্ষুন্ন করার দরকার নেই। কিছু [বাস্তবায়ন ==স্ট্যান্ডার্ডকে এক্সটেনশন হিসাবে সমর্থন করে তবে সমস্তটি নয়। বোর্ন শেল এর ash,posh এর [s অথবা /bin/[উদাহরণস্বরূপ কিছু ব্যবস্থা করে না। ==যোগ করা হয়েছিল ksh, আমি মনে করি এটির নতুন (( ... ))নির্মাণে একই অপারেটরের সাথে ধারাবাহিকতার জন্য (যার মধ্যে = এবং == উভয় রয়েছে, তবে এটি কোনও মান নয়)
স্টাফেন চ্যাজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.