গাণিতিক সম্পাদন করার জন্য কোন যুক্তিকে কোনও পূর্ণসংখ্যার রূপান্তর করতে এবং এটি প্রিন্ট আউট করার চেষ্টা করছেন, এর জন্য বলুন addOne.sh
:
echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
গাণিতিক সম্পাদন করার জন্য কোন যুক্তিকে কোনও পূর্ণসংখ্যার রূপান্তর করতে এবং এটি প্রিন্ট আউট করার চেষ্টা করছেন, এর জন্য বলুন addOne.sh
:
echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1
উত্তর:
ব্যাশে, কেউ "পাটিগণিত সম্পাদনের জন্য একটি যুক্তি একটি পূর্ণসংখ্যায় রূপান্তর করে না"। ব্যাশে ভেরিয়েবলগুলি প্রসঙ্গের ভিত্তিতে পূর্ণসংখ্যা বা স্ট্রিং হিসাবে বিবেচনা করা হয়।
পাটিগণিত সম্পাদন করতে আপনার গাণিতিক সম্প্রসারণ অপারেটরটি নেওয়া উচিত $((...))
। উদাহরণ স্বরূপ:
$ a=2
$ echo "$a + 1"
2 + 1
$ echo "$(($a + 1))"
3
বা সাধারণত পছন্দসই:
$ echo "$((a + 1))"
3
আপনার সচেতন হওয়া উচিত যে বাশ (ksh93, zsh বা yash এর বিপরীতে) কেবল পূর্ণসংখ্যার গাণিতিক সম্পাদন করে । আপনার যদি ভাসমান পয়েন্ট সংখ্যা (দশমিক সংখ্যা সহ) থাকে তবে সহায়তা করার জন্য অন্যান্য সরঞ্জাম রয়েছে। উদাহরণস্বরূপ, ব্যবহার করুন bc
:
$ b=3.14
$ echo "$(($b + 1))"
bash: 3.14 + 1: syntax error: invalid arithmetic operator (error token is ".14 + 1")
$ echo "$b + 1" | bc -l
4.14
অথবা আপনি বাশের পরিবর্তে ভাসমান পয়েন্ট গণিত সমর্থন সহ একটি শেল ব্যবহার করতে পারেন:
zsh> echo $((3.14 + 1))
4.14
অন্য উপায়, আপনি ব্যবহার করতে পারেন expr
উদা:
$ version="0002"
$ expr $version + 0
2
$ expr $version + 1
3
ইন bash
, আপনি মুদ্রণ -v ব্যবহার করে যে কোনও কিছু থেকে পূর্ণসংখ্যায় রূপান্তর করতে পারেন :
printf -v int '%d\n' "$1" 2>/dev/null
ভাসমান সংখ্যাটি পূর্ণসংখ্যায় রূপান্তরিত হবে, এমন কিছুর মতো কিছু দেখায় না তবে এটি ০ তে রূপান্তরিত হবে 0. e
উদাহরণ:
$ printf -v int '%d\n' 123.123 2>/dev/null
$ printf '%d\n' "$int"
123
$ printf -v int '%d\n' abc 2>/dev/null
$ printf '%d\n' "$int"
0
$ printf -v int '%d\n' 1e10 2>/dev/null
$ printf '%d\n' "$int"
1
printf -v
কমান্ড প্রতিস্থাপনের মাধ্যমে অর্জন করা যেতে পারে:int="$(printf '%d' 123.123 2>/dev/null)"
bash
আপনার ব্যবহৃত সংস্করণটি কী ?
লিনাক্স এবং ওএসএক্স উভয় পরিবেশে চলার জন্য ব্যাশ স্ক্রিপ্টগুলি বিকাশ করার সময় সম্প্রতি একইরকম পরিস্থিতি উপস্থিত হয়েছিল। ওএসএক্সের একটি কমান্ডের ফলাফল ফলাফল কোড সহ একটি স্ট্রিং প্রদান করে; যেমন " 0"
,। অবশ্যই, এটি নিম্নলিখিত ক্ষেত্রে সঠিকভাবে পরীক্ষা করতে ব্যর্থ হয়েছে:
if [[ $targetCnt != 0 ]]; then...
সমাধানটি জোর করা (অর্থাত্ 'রূপান্তর') ফলাফলকে পূর্ণসংখ্যার সাথে করা হয়েছিল, @ জন1024 উপরে যে উত্তর দিয়েছে তার অনুরূপ যাতে এটি প্রত্যাশার মতো কাজ করে:
targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...
==
ইত্যাদি ইন [[
(এছাড়াও [
ওরফে test
) স্ট্রিং তুলনা করে। পাটিগণিত তুলনার জন্য বিভিন্ন অপারেটর আছে যেমন [[ $targetcnt -ne 0 ]]
; শর্তাধীন অভিব্যক্তিগুলির অধীনে ম্যানপেজ (বা তথ্য) দেখুন। স্পেসগুলি নির্দিষ্ট করে ছাঁটাতে, আপনি ডিফল্ট ওয়ার্ডস্প্লিটিং (সম্পন্ন হয়নি ) পেতে [
অব্যক্ত ভেরিয়েবল প্রসারণের সাহায্যে ব্যবহার করতে পারেন তবে সাধারণভাবে সেই পদ্ধতির আপনাকে বিপদে ডেকে আনে। [ $targetcnt == 0 ]
[[
রঙ কোডগুলি সম্পর্কে যত্নশীল, এমনকি ট্রেসে ( -x
) এগুলি প্রদর্শিত হবে না, এটি কী দেবে তা হ'ল আপনি যেভাবে মুদ্রণ করলেন তা বিবেচনা না করেই যে সংখ্যাটি বলে মনে হচ্ছে তার স্ট্রিংগুলি উদ্ধৃতিতে আবৃত।
$((var+var))
এমনকি অপারেশনগুলির মতো অপারেশন এমনকি ব্যর্থও হয় যদিও আপনি echo
বা printf
উভয় ওয়ার্স একই হয়। আমি ঠিক করতে পারি না যেহেতু আমি কেবল আউটপুট উত্সে রঙ কোডগুলি অক্ষম করে এটি ঠিক করতে সক্ষম হয়েছি। এটি ট্রেস লগগুলিতে সন্ধান করতে আপনি আপত্তিজনক চলকটি যেমনটি var='0'
হওয়া উচিত ঠিক var=0
sed
না থাকলে আপনি এটি অক্ষম করতে না
printf "1 + %s\n" $1 won't do ?