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


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

বাবু সংস্করণ 4.2.45 (1) - রিলিজ (x86_64-pc-linux-gnu) উবুন্টু 13.10।


455
2017-12-03 16:34


উত্স




উত্তর:


ব্যাশে একটি পরিবর্তনশীল বৃদ্ধি করার একাধিক উপায় রয়েছে, কিন্তু আপনি যা চেষ্টা করেছেন তা সঠিক নয়।

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

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


722
2017-12-03 16:39



অথবা ((++var)) অথবা ((var=var+1)) অথবা ((var+=1))। - gniourf_gniourf
অথবা var = $ (expr $ var + 1) - Javier López
মজার ব্যাপার হলো, var=0; ((var++)) যখন একটি ত্রুটি কোড ফেরৎ var=0; ((var++)); ((var++)) না. কোন ধারণা কেন? - phunehehe
@ ফুনেহে তাকান help '(('। শেষ লাইন বলেছেন: Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise. - Radu Rădeanu
এটি ব্যবহার করার জন্য নিরাপদ let var++, উদ্ধৃতি চিহ্ন বিনা? - wjandrea


var=$((var + 1))

Bash ব্যবহার করে গাণিতিক ব্যবহার করে $((...)) বাক্য গঠন.


101
2017-12-03 16:38



গ্রহণযোগ্য উত্তর চেয়ে বেশ ভাল। মাত্র 10% বেশি জায়গাতে, আপনি যথেষ্ট উদাহরণ সরবরাহ করতে সক্ষম হয়েছেন (একটি প্রচুর - নয়টি আপনি যখন দেখছেন তখন বিন্দুতে ওভারকিল হয়), এবং আপনি আমাদের জানাতে যথেষ্ট তথ্য সরবরাহ করেছেন ((...))bash মধ্যে গাণিতিক ব্যবহার করার চাবি। আমি বুঝতে পারিনি যে কেবল গৃহীত উত্তরটি দেখছি - আমি মনে করি অপারেশনগুলির ক্রম সম্পর্কে কিছু বিরাট বিধি রয়েছে বা গ্রহণযোগ্য উত্তরের সমস্ত বন্ধনীকে অগ্রসর করে এমন কিছু। - ArtOfWarfare


বিভিন্ন অপশন পারফরম্যান্স বিশ্লেষণ

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

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=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 এটি একটি slowin হয় না যতদূর ধীরতম।


62
2017-07-31 17:15



দৃশ্যত গতি কমান্ড দৈর্ঘ্য সঙ্গে correlates। আমি কি একই কমান্ড কল কমান্ড আশ্চর্য। - MatthewRock
i=(expr ...) একটি বাক্য গঠন ত্রুটি। আপনি কি বোঝাতে চেয়েছিলেন i=$(expr ...)? - muru
@ মুর ফিক্সড, এবং লুপের জন্য একটি চেক যুক্ত করেছে। - wjandrea


এই আছে:

var=`expr $var + 1`

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

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


14
2017-08-22 23:11



আপনি ব্যবহার করতে পারেন i=$((i+1)) - wjandrea
প্রক্রিয়া প্রতিস্থাপন যদি $(...) এই শেলের উপর উপলব্ধ, আমি পরিবর্তে এটি ব্যবহার করার সুপারিশ করব। - Radon Rosborough


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

$ declare -i var=5
$ echo $var
5
$ var=$var+1
$ echo $var
6

রেফারেন্স: ভেরিয়েবলের ধরন, বাচ্চাদের জন্য বাশ গাইড


9
2017-12-06 22:19





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

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

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


6
2018-02-23 13:58





রিটার্ন কোড 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

4