বাশ: আমি ভেঙেছি [[<]]


14

আমি একটি বাশ স্ক্রিপ্ট লিখছিলাম এবং হঠাৎ এই আচরণ শুরু হয়েছিল:

[[ 1 < 2 ]]; echo $?  # outputs 0
[[ 2 < 13 ]]; echo $? # outputs 1

তবে -ltসাবলীলভাবে কাজ করে:

[[ 1 -lt 2 ]]; echo $?  # outputs 0
[[ 2 -lt 13 ]]; echo $? # outputs 0

আমি কি ঘটনাক্রমে <কোনওভাবে ওভাররাইট করেছিলাম ?

এই আচরণটি পরীক্ষা করার জন্য আমি এখানে একটি স্ক্রিপ্ট লিখেছি:

#!/bin/bash

for a in {1..5}
do
    for b in {1..20}
    do
        [[ $a < $b ]] && echo $a $b
    done

    echo
done

এখানে ফলাফল:

1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
1 17
1 18
1 19
1 20

2 3
2 4
2 5
2 6
2 7
2 8
2 9
2 20

3 4
3 5
3 6
3 7
3 8
3 9

4 5
4 6
4 7
4 8
4 9

5 6
5 7
5 8
5 9

পরিবর্তন <করার জন্য -ltস্ক্রিপ্টের মধ্যে স্বাভাবিক আউটপুট (দেয় 5 10উদাহরণস্বরূপ দেখায়)।

রিবুট করার ফলে কোনও পরিবর্তন হয়নি।

আমার বাশ সংস্করণটি জিএনইউ ব্যাশ, সংস্করণ 4.3.42 (1) -রেলিজ (x86_64-পিসি-লিনাক্স-গনু)। আমি উবুন্টু 15.10 এ আছি। এখানে অন্যান্য তথ্যগুলি কী প্রাসঙ্গিক তা আমি জানি না।


16
সঙ্গে <অপারেশন, আপনি একটি স্ট্রিং তুলনা তৈরি করছেন, যেহেতু -ltঅপারেটর সাংখ্যিক তুলনা হয়, তাহলে আপনি ফলাফল আপনি তালিকা দেয়া হয়েছে তাকান, তাহলে আপনি এটা বুঝতে হবে। সংখ্যাগতভাবে 2 অন্যান্য বর্ণের বর্ণমালায় 10 এর চেয়ে কম হয়।
মেলবারস্লান

উত্তর:


51

থেকে bashমানুষ পাতা।

[[, <এবং> অপারেটরগুলি বর্তমান লোকেল ব্যবহার করে অভিধানিকভাবে সাজান।

আউটপুট থেকে, এটি নকশাকৃত হিসাবে কাজ করছে বলে মনে হচ্ছে।


35
অন্য কথায়, আপনি একটি বাগ খুঁজে পেয়েছেন ধরে নেওয়ার আগে ম্যান পৃষ্ঠাটি পড়ুন । ;)
ওয়াইল্ডকার্ড

সত্য। সম্ভবত আমি যে স্ক্রিপ্টটিতে মূলত কাজ করছিলাম তা আসলে 'সঠিকভাবে' (যেমন ব্যর্থ [[$ মাইভার <13]]) তে কাজ করার সময় আমি এই আচরণটি লক্ষ্য করেছি। এই প্রশ্নে এখন আমার কিছু করা উচিত? আমরা কি এই সাইটে [সমাধান করা] বা অন্য কিছু অন্তর্ভুক্ত করতে শিরোনামটি পরিবর্তন করি? শিরোনামটি কি অন্যভাবে বর্ণনামূলক কিছুতে পরিবর্তন করা উচিত?
শামুক-অন-এ-কোয়েস্ট

2
না, প্রশ্নের শিরোনাম পরিবর্তন করবেন না। এই উত্তরের পাশে থাকা চেক চিহ্নটি ইঙ্গিত করে যে প্রশ্নের সমাধান হয়েছে তা যথেষ্ট।
saiarcot895

14
@ উইল্ডকার্ড ওপিকে ধরে নেই যে তারা একটি বাগ খুঁজে পেয়েছে। তারা স্পষ্টভাবে পরামর্শ দেয় যে সম্ভবত তারা আচরণটি পরিবর্তন করতে কিছু করেছে। এমনকি শিরোনাম যতটা ধরে!
jpmc26

5

কেমন:

for a in {1..5}; 
do     
  for b in {1..20};     
  do         
    (( $a < $b )) && echo $a $b
  done      
  echo
done

Http://www.tldp.org/LDP/abs/html/dblparens.html অনুসারে

লেট কমান্ডের অনুরূপ, ((...)) পাটিগণিতের সম্প্রসারণ এবং মূল্যায়নের অনুমতি দেয়। এর সর্বাধিক আকারে, a = $ ((5 + 3)) একটি 5 + 3 বা 8 সেট করে However তবে, এই দ্বৈত-বন্ধনী নির্মাণটি বাশ-এ ভেরিয়েবলগুলির সি-স্টাইলের ম্যানিপুলেশনকে অনুমতি দেওয়ার জন্যও একটি প্রক্রিয়া example , ((var ++))।


2
আপনি প্রশ্নের বিন্দুটি মিস করছেন - এটি "আমি কীভাবে এই মানগুলি তুলনা করতে পারি?" নয় তবে "কেন এটি এর মতো আচরণ করে?"।
গুন্টবার্ট

7
এটি ইতিমধ্যে উত্তর ছিল। তবে তিনি একটি পাটিগণিতের এক্সপ্রেশন ব্যবহার করতে চেয়েছিলেন এটি উল্লেখ করা উপযুক্ত হতে পারে যে সেখানে এমন কনস্ট্রাক্ট রয়েছে যা আপনাকে শেলের মধ্যে ব্যবহার করতে দেয়।
পলস্মেকার

3

প্রথমত, [[ পসিক্স নয় এবং এড়ানো উচিত।

দ্বিতীয়ত, আপনি যদি <গাণিতিক পরীক্ষার অংশ হিসাবে ব্যবহার করতে চান তবে আপনি এটি করতে পারেন তবে বিভিন্ন বাক্য গঠন সহ:

if [ $((2 < 13)) = 1 ]
then
  echo '2 is less than 13'
else
  echo '2 is greater or equal to 13'
fi

বা:

if expr 2 '<' 13
then
  echo '2 is less than 13'
else
  echo '2 is greater or equal to 13'
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.