ব্যাশে পূর্ণসংখ্যার সাথে যুক্তি স্ট্রিং


72

গাণিতিক সম্পাদন করার জন্য কোন যুক্তিকে কোনও পূর্ণসংখ্যার রূপান্তর করতে এবং এটি প্রিন্ট আউট করার চেষ্টা করছেন, এর জন্য বলুন addOne.sh:

echo $1 + 1
>>sh addOne.sh 1
prints 1 + 1

আমি আপনার প্রশ্নটি ফর্ম্যাট করার চেষ্টা করি, তবে এটি কোনওরকম অস্পষ্ট। printf "1 + %s\n" $1 won't do ?
আরচেমার

উত্তর:


87

ব্যাশে, কেউ "পাটিগণিত সম্পাদনের জন্য একটি যুক্তি একটি পূর্ণসংখ্যায় রূপান্তর করে না"। ব্যাশে ভেরিয়েবলগুলি প্রসঙ্গের ভিত্তিতে পূর্ণসংখ্যা বা স্ট্রিং হিসাবে বিবেচনা করা হয়।

পাটিগণিত সম্পাদন করতে আপনার গাণিতিক সম্প্রসারণ অপারেটরটি নেওয়া উচিত $((...))। উদাহরণ স্বরূপ:

$ 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

You (()) বা (()) ব্যবহার অনিরাপদ যদি আপনি না জানেন তবে স্ট্রিংগুলি কী কী (ব্যবহারকারীর ইনপুট)। এটি বিবেচনা করুন: foo = foo ((foo + = 0)) foo এর পুনরাবৃত্তি মূল্যায়ন করার চেষ্টা করার ফলে এটি স্ক্রিপ্টটি ক্র্যাশ করবে। এর সাথে একই: foo = foo foo = $ ((foo + 0))
শিল্প


10

ইন 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

2
এটি ছাড়া অন্য শেলগুলিতে printf -vকমান্ড প্রতিস্থাপনের মাধ্যমে অর্জন করা যেতে পারে:int="$(printf '%d' 123.123 2>/dev/null)"
অ্যাড্রিয়ান গন্টার

2
এটি ব্যাশে কাজ করে না।
মাইকেল মার্টিনেজ

@ মিশেলমার্টিনেজ আপনি কি নিশ্চিত? bashআপনার ব্যবহৃত সংস্করণটি কী ?
cuonglm

জিএনইউ বাশ, সংস্করণ 4.2.46 (1) -রিলেজ (x86_64-redhat-linux-gnu)
মাইকেল মার্টিনেজ

5

লিনাক্স এবং ওএসএক্স উভয় পরিবেশে চলার জন্য ব্যাশ স্ক্রিপ্টগুলি বিকাশ করার সময় সম্প্রতি একইরকম পরিস্থিতি উপস্থিত হয়েছিল। ওএসএক্সের একটি কমান্ডের ফলাফল ফলাফল কোড সহ একটি স্ট্রিং প্রদান করে; যেমন " 0",। অবশ্যই, এটি নিম্নলিখিত ক্ষেত্রে সঠিকভাবে পরীক্ষা করতে ব্যর্থ হয়েছে:

if [[ $targetCnt != 0 ]]; then...

সমাধানটি জোর করা (অর্থাত্ 'রূপান্তর') ফলাফলকে পূর্ণসংখ্যার সাথে করা হয়েছিল, @ জন1024 উপরে যে উত্তর দিয়েছে তার অনুরূপ যাতে এটি প্রত্যাশার মতো কাজ করে:

targetCnt=$(($targetCnt + 0))
if [[ $targetCnt != 0 ]]; then...

3
==ইত্যাদি ইন [[(এছাড়াও [ওরফে test) স্ট্রিং তুলনা করে। পাটিগণিত তুলনার জন্য বিভিন্ন অপারেটর আছে যেমন [[ $targetcnt -ne 0 ]]; শর্তাধীন অভিব্যক্তিগুলির অধীনে ম্যানপেজ (বা তথ্য) দেখুন। স্পেসগুলি নির্দিষ্ট করে ছাঁটাতে, আপনি ডিফল্ট ওয়ার্ডস্প্লিটিং (সম্পন্ন হয়নি ) পেতে [অব্যক্ত ভেরিয়েবল প্রসারণের সাহায্যে ব্যবহার করতে পারেন তবে সাধারণভাবে সেই পদ্ধতির আপনাকে বিপদে ডেকে আনে। [ $targetcnt == 0 ][[
dave_thompson_085

-2

রঙ কোডগুলি সম্পর্কে যত্নশীল, এমনকি ট্রেসে ( -x) এগুলি প্রদর্শিত হবে না, এটি কী দেবে তা হ'ল আপনি যেভাবে মুদ্রণ করলেন তা বিবেচনা না করেই যে সংখ্যাটি বলে মনে হচ্ছে তার স্ট্রিংগুলি উদ্ধৃতিতে আবৃত।


1
আপনার উত্তরটি কিছুটা অস্পষ্ট বলে আমি ভোট দিয়েছি। সম্ভবত আপনি যুক্ত করতে পারেন যা স্ক্রিপ্ট সংশোধন করা উচিত?
টাইম 4 টি

এটি বাশ + পূর্ণসংখ্যক + স্ট্রিংয়ের অনুসন্ধানে শীর্ষস্থানীয় উত্তর ছিল তাই আমি এর সাথে সম্পর্কিত তথ্যগুলির একটি টুকরো যুক্ত করেছি যা উত্তরগুলির মধ্যে অন্তর্ভুক্ত ছিল না, এটি যখন স্ট্রিংগুলি রঙের কোডগুলিতে আবৃত হয় তবে এটি অস্পষ্ট হতে পারে কেন $((var+var))এমনকি অপারেশনগুলির মতো অপারেশন এমনকি ব্যর্থও হয় যদিও আপনি echoবা printfউভয় ওয়ার্স একই হয়। আমি ঠিক করতে পারি না যেহেতু আমি কেবল আউটপুট উত্সে রঙ কোডগুলি অক্ষম করে এটি ঠিক করতে সক্ষম হয়েছি। এটি ট্রেস লগগুলিতে সন্ধান করতে আপনি আপত্তিজনক চলকটি যেমনটি var='0'হওয়া উচিত ঠিক var=0
তেমনটি

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