আমি উভয় var=$var+1
এবং var=($var+1)
সাফল্য ব্যতীত একটি সংখ্যা পরিবর্তনশীল বর্ধিত করার চেষ্টা করেছি । পরিবর্তনশীল একটি সংখ্যা, যদিও ব্যাশ এটি স্ট্রিং হিসাবে পড়ছে বলে মনে হচ্ছে।
উশুন্টু 13.10-এ বাশ সংস্করণ 4.2.45 (1) - রিলিজ (x86_64-pc-linux-gnu)।
আমি উভয় var=$var+1
এবং var=($var+1)
সাফল্য ব্যতীত একটি সংখ্যা পরিবর্তনশীল বর্ধিত করার চেষ্টা করেছি । পরিবর্তনশীল একটি সংখ্যা, যদিও ব্যাশ এটি স্ট্রিং হিসাবে পড়ছে বলে মনে হচ্ছে।
উশুন্টু 13.10-এ বাশ সংস্করণ 4.2.45 (1) - রিলিজ (x86_64-pc-linux-gnu)।
উত্তর:
ব্যাশে ভেরিয়েবল বাড়ানোর একাধিক উপায় রয়েছে তবে আপনি যা চেষ্টা করেছেন তা সঠিক নয়।
আপনি গাণিতিক সম্প্রসারণের জন্য উদাহরণস্বরূপ ব্যবহার করতে পারেন :
var=$((var+1))
((var=var+1))
((var+=1))
((var++))
অথবা আপনি ব্যবহার করতে পারেন let
:
let "var=var+1"
let "var+=1"
let "var++"
আরও দেখুন: http://tldp.org/LDP/abs/html/dblparens.html ।
var=0; ((var++))
করেও একটি ত্রুটি কোড var=0; ((var++)); ((var++))
দেয়। কোন ধারণা কেন?
help '(('
। শেষ লাইনটি বলেছেন:Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise.
1
কারণ @ gniourf_gniourf এর টিপটি অন্তর্ভুক্ত ((++var))
তবে তা নয় ((var++))
।
let var++
উদ্ধৃতি ব্যতীত এটি কী নিরাপদ ?
var=$((var + 1))
ব্যাশে পাটিগণিত $((...))
সিনট্যাক্স ব্যবহার করে।
((...))
গাণিতিক ব্যবহারের মূল কী তা জানার জন্য পর্যাপ্ত তথ্য সরবরাহ করেছিলেন you ব্যাশে আমি বুঝতে পারি নি যে কেবল স্বীকৃত উত্তরটির দিকে তাকিয়েছি - আমি ভেবেছিলাম পরিচালিত ক্রমের বিষয়ে কোনও অদ্ভুত নিয়ম রয়েছে বা গৃহীত উত্তরের সমস্ত প্রথম বন্ধনীর দিকে নিয়ে যাওয়ার মতো কিছু আছে।
রাডু রেদেনুর জবাবের জন্য ধন্যবাদ যা বাশে পরিবর্তনশীল বাড়ানোর জন্য নিম্নলিখিত উপায়গুলি সরবরাহ করে:
var=$((var+1))
((var=var+1))
((var+=1))
((var++))
let "var=var+1"
let "var+=1"
let "var++"
এছাড়াও অন্যান্য উপায় আছে। উদাহরণস্বরূপ, এই প্রশ্নের অন্যান্য উত্তরগুলি দেখুন।
let var++
var=$((var++))
((++var))
{
declare -i var
var=var+1
var+=1
}
{
i=0
i=$(expr $i + 1)
}
অনেকগুলি বিকল্প থাকা সত্ত্বেও এই দুটি প্রশ্ন বাড়ে:
#!/bin/bash
# To focus exclusively on the performance of each type of increment
# statement, we should exclude bash performing while loops from the
# performance measure. So, let's time individual scripts that
# increment $i in their own unique way.
# Declare i as an integer for tests 12 and 13.
echo > t12 'declare -i i; i=i+1'
echo > t13 'declare -i i; i+=1'
# Set i for test 14.
echo > t14 'i=0; i=$(expr $i + 1)'
x=100000
while ((x--)); do
echo >> t0 'i=$((i+1))'
echo >> t1 'i=$((i++))'
echo >> t2 '((i=i+1))'
echo >> t3 '((i+=1))'
echo >> t4 '((i++))'
echo >> t5 '((++i))'
echo >> t6 'let "i=i+1"'
echo >> t7 'let "i+=1"'
echo >> t8 'let "i++"'
echo >> t9 'let i=i+1'
echo >> t10 'let i+=1'
echo >> t11 'let i++'
echo >> t12 'i=i+1'
echo >> t13 'i+=1'
echo >> t14 'i=$(expr $i + 1)'
done
for script in t0 t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t14; do
line1="$(head -1 "$script")"
printf "%-24s" "$line1"
{ time bash "$script"; } |& grep user
# Since stderr is being piped to grep above, this will confirm
# there are no errors from running the command:
eval "$line1"
rm "$script"
done
i=$((i+1)) user 0m0.992s
i=$((i++)) user 0m0.964s
((i=i+1)) user 0m0.760s
((i+=1)) user 0m0.700s
((i++)) user 0m0.644s
((++i)) user 0m0.556s
let "i=i+1" user 0m1.116s
let "i+=1" user 0m1.100s
let "i++" user 0m1.008s
let i=i+1 user 0m0.952s
let i+=1 user 0m1.040s
let i++ user 0m0.820s
declare -i i; i=i+1 user 0m0.528s
declare -i i; i+=1 user 0m0.492s
i=0; i=$(expr $i + 1) user 0m5.464s
মনে হচ্ছে ব্যাশ করণ এ দ্রুততম i+=1
যখন $i
একটি পূর্ণসংখ্যা হিসাবে ঘোষণা করা হয়। let
বিবৃতিগুলি বিশেষত ধীর বলে মনে হচ্ছে এবং expr
এটি এতটা ধীর কারণ এটি কোনও বিল্টিন নয়।
এটিও রয়েছে:
var=`expr $var + 1`
স্পেসগুলি সাবধানে নোট করুন এবং ' না '
যদিও রাদুর উত্তর এবং মন্তব্যগুলি সম্পূর্ণ এবং অত্যন্ত সহায়ক, সেগুলি বাশ-নির্দিষ্ট। আমি জানি আপনি বিশেষভাবে বাশ সম্পর্কে জিজ্ঞাসা করেছিলেন, তবে আমি ভেবেছিলাম যে আমি এই প্রশ্নটি খুঁজে পেয়েছি যখন আমি ইউসিএলিনাক্সের অধীনে ব্যস্তবক্সে শ ব্যবহার করে একই জিনিসটি দেখার চেষ্টা করছিলাম। ব্যাশের বাইরে এই বহনযোগ্য।
i=$((i+1))
$(...)
এই শেলটিতে উপলভ্য থাকে তবে আমি এটির পরিবর্তে এটি ব্যবহারের পরামর্শ দেব।
আপনি যদি $var
কোনও পূর্ণসংখ্যা হিসাবে ঘোষণা করেন, তবে আপনি যা প্রথমবার চেষ্টা করেছিলেন তা বাস্তবে কার্যকর হবে:
$ declare -i var=5
$ echo $var
5
$ var=$var+1
$ echo $var
6
সমস্ত উত্তরের একটি পদ্ধতি অনুপস্থিত - bc
$ VAR=7
$ bc <<< "$VAR+2"
9
$ echo $VAR
7
$ VAR=$( bc <<< "$VAR+1" )
$ echo $VAR
8
bc
POSIX স্ট্যান্ডার্ড দ্বারা নির্দিষ্ট করা হয়েছে , সুতরাং উবুন্টু এবং POSIX- অনুবর্তী সিস্টেমের সমস্ত সংস্করণে উপস্থিত থাকা উচিত। <<<
ফেরৎ রদবদল হতে পারে echo "$VAR" | bc
বহনযোগ্যতা জন্য, কিন্তু যেহেতু প্রশ্ন সম্পর্কে জিজ্ঞেস করে bash
- এটা শুধু ব্যবহার করতে ঠিক আছে <<<
।
রিটার্ন কোড 1
ইস্যু সব ডিফল্ট রূপগুলো (জন্য উপস্থিত থাকলে let
, (())
, ইত্যাদি)। এটি প্রায়শই সমস্যার কারণ হিসাবে ব্যবহৃত স্ক্রিপ্টগুলিতে সমস্যা সৃষ্টি করে set -o errexit
। 1
গণিতের এক্সপ্রেশনগুলি থেকে ত্রুটি কোড রোধ করতে আমি যা ব্যবহার করছি তা যা এখানে মূল্যায়ন করে 0
;
math() { (( "$@" )) || true; }
math a = 10, b = 10
math a++, b+=2
math c = a + b
math mod = c % 20
echo $a $b $c $mod
#11 12 23 3
এই জাতীয় কোনও সহজ কাজটি সম্পাদন করার জন্য এটি সবচেয়ে খারাপ উপায় হতে পারে তবে আমি অনুমান করি মজাদার জন্য এটি কোডটি নথিভুক্ত করতে চেয়েছিলাম (কোড গল্ফের সম্পূর্ণ বিপরীত)।
$ var=0
$ echo $var
0
$ var="$(python -c 'print('$var'+1)')"
$ echo $var
1
অথবা
$ var="$(printf '%s\n' $var'+1' | bc)"
$ echo $var
1
গুরুত্ব সহকারে এখানে আরও অনেক ভাল পছন্দগুলির একটি ব্যবহার করুন।
((++var))
বা((var=var+1))
বা((var+=1))
।