কিভাবে বাশে একটি পরিবর্তনশীল বৃদ্ধি?

আমি উভয় ব্যবহার করে একটি সংখ্যাসূচক পরিবর্তনশীল বৃদ্ধি করার চেষ্টা করেছি var=$var+1 এবং var=($var+1) সাফল্য ছাড়া. পরিবর্তনশীল একটি সংখ্যা, যদিও ব্যাশ একটি স্ট্রিং হিসাবে এটি পড়া বলে মনে হচ্ছে.

ব্যাশ সংস্করণ 4.2.45 (1)-মুক্তি (এক্স 86_64-পিসি-লিনাক্স-জিএনইউ) চালু উবুন্টু 13.10.

ব্যাশে একটি পরিবর্তনশীল বাড়ানোর একাধিক উপায় রয়েছে তবে আপনি যা চেষ্টা করেছেন তা সঠিক নয়

আপনি উদাহরণস্বরূপ ব্যবহার করতে পারেন পাটিগণিত সম্প্রসারণ:

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=$((var + 1))

বাশে পাটিগণিত ব্যবহার করে $((...)) সিনট্যাক্স.

1 দ্বারা বৃদ্ধি বিভিন্ন বিকল্প, এবং কর্মক্ষমতা বিশ্লেষণ

ধন্যবাদ রাদু আর ফ্লোটেডিয়ানু এর উত্তর যে বাশে একটি পরিবর্তনশীল বৃদ্ধি নিম্নলিখিত উপায় প্রদান করে:

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)}

অনেকগুলি বিকল্প থাকা এই দুটি প্রশ্নের দিকে পরিচালিত করে:

  1. তাদের মধ্যে একটি কর্মক্ষমতা পার্থক্য আছে?
  2. যদি তা হয় তবে কোনটি সেরা সম্পাদন করে?

ক্রমবর্ধমান কর্মক্ষমতা পরীক্ষা কোড:

#!/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=100000while ((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)'donefor 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.992si=$((i++))              user    0m0.964s((i=i+1))               user    0m0.760s((i+=1))                user    0m0.700s((i++))                 user    0m0.644s((++i))                 user    0m0.556slet "i=i+1"             user    0m1.116slet "i+=1"              user    0m1.100slet "i++"               user    0m1.008slet i=i+1               user    0m0.952slet i+=1                user    0m1.040slet i++                 user    0m0.820sdeclare -i i; i=i+1     user    0m0.528sdeclare -i i; i+=1      user    0m0.492si=0; i=$(expr $i + 1)   user    0m5.464s

উপসংহার:

মনে হচ্ছে বাশ পারফর্ম করতে দ্রুততম i+=1 যখন $i পূর্ণসংখ্যা হিসাবে ঘোষণা করা হয়. let বিবৃতি বিশেষ করে ধীর বলে মনে হচ্ছে, এবং expr এটি একটি ব্যাশ মধ্যে নির্মিত হয় না, কারণ দ্বারা পর্যন্ত ধীরতম হয়.

এছাড়াও এই আছে:

var=`expr $var + 1`

স্পেস সতর্ক নোট নিন এবং এছাড়াও ` নয় '

যদিও রাদুর উত্তর, এবং মন্তব্য, সম্পূর্ণ এবং খুব সহায়ক, তারা বাশ-নির্দিষ্ট. আমি জানি আপনি বাশ সম্পর্কে বিশেষভাবে জিজ্ঞাসা করেছিলেন, তবে আমি ভেবেছিলাম যে আমি যখন ইউসিলিনাক্সের অধীনে বুসিবক্সে এসএইচ ব্যবহার করে একই জিনিসটি করতে চাইছি তখন থেকেই আমি এই প্রশ্নটি পেয়েছি ব্যাশ পরেও এই পোর্টেবল.

যদি আপনি ঘোষণা করেন $var পূর্ণসংখ্যা হিসাবে, তারপরে আপনি প্রথমবার যা চেষ্টা করেছিলেন তা আসলে কাজ করবে:

$ declare -i var=5$ echo $var5$ var=$var+1$ echo $var6

তথ্যসূত্র: ভেরিয়েবলের প্রকার, নতুনদের জন্য বাশ গাইড

সব উত্তর অনুপস্থিত এক পদ্ধতি আছে - bc

$ VAR=7    $ bc <<< "$VAR+2"9$ echo $VAR7$ VAR=$( bc <<< "$VAR+1" )$ echo $VAR8

bc দ্বারা নির্দিষ্ট করা হয় পসিক্স স্ট্যান্ডার্ড, তাই উবুন্টু এবং পোসিক্স-কমপ্লায়েন্ট সিস্টেমের সমস্ত সংস্করণে উপস্থিত হওয়া উচিত দ্য <<< পুনঃনির্দেশ পরিবর্তন করা যেতে পারে echo "$VAR" | bc বহনযোগ্যতার জন্য, তবে যেহেতু প্রশ্নটি জিজ্ঞাসা করে bash - এটা ঠিক ব্যবহার করা ঠিক আছে <<<.

রিটার্ন কোড 1 সমস্যা সব ডিফল্ট রূপগুলো জন্য উপস্থিত (let, (()), ইত্যাদি). এটি প্রায়শই সমস্যা সৃষ্টি করে, যেমন স্ক্রিপ্টগুলিতে ব্যবহার করে set -o errexit. ত্রুটি কোড প্রতিরোধ করতে আমি যা ব্যবহার করছি তা এখানে 1 গণিত এক্সপ্রেশন থেকে যা মূল্যায়ন করে 0;

math() { (( "$@" )) || true; }math a = 10, b = 10math a++, b+=2math c = a + bmath mod = c % 20echo $a $b $c $mod#11 12 23 3

এই ধরনের একটি সহজ কাজ সম্পন্ন করার সবচেয়ে খারাপ উপায় হতে হয়েছে কিন্তু আমি শুধু আমি অনুমান মজা করার জন্য এটি নথিতে চেয়েছিলেন (কোড গলফ সম্পূর্ণ বিপরীত).

$ var=0$ echo $var0$ var="$(python -c 'print('$var'+1)')"$ echo $var1

অথবা

$ var="$(printf '%s\n' $var'+1' | bc)"$ echo $var1

গম্ভীরভাবে এখানে অন্যান্য অনেক ভালো পছন্দ এক ব্যবহার.

এটি নিরাপদ বাজি

(( var = var + 1 ))

ফলে মান অ শূন্য হয়, তাহলে ত্রুটি প্রস্থান সেটিং আপনার স্ক্রিপ্ট বন্ধ হবে

set -evar=0(( var++ ))echo You will never get here