Saya telah mencoba untuk kenaikan variabel numerik menggunakan kedua var=$var+1
dan var=($var+1)
tanpa keberhasilan. Variabel adalah jumlah, meskipun bash tampaknya membaca itu sebagai string.
Bash versi 4.2.45(1)-release (x86_64-pc-linux-gnu) pada Ubuntu 13.10.
Ada lebih dari satu cara untuk kenaikan variabel di bash, tapi apa yang anda coba adalah tidak benar.
Anda dapat menggunakan misalnya aritmatika ekspansi:
var=$((var+1))
((var=var+1))
((var+=1))
((var++))
Atau anda dapat menggunakan membiarkan
:
let "var=var+1"
let "var+=1"
let "var++"
Lihat juga: http://tldp.org/LDP/abs/html/dblparens.html.
var=$((var + 1))
Aritmatika di bash menggunakan $((...))
sintaks.
Terima kasih untuk Radu Rădeanu's jawaban yang menyediakan cara-cara berikut untuk kenaikan variabel di bash:
var=$((var+1))
((var=var+1))
((var+=1))
((var++))
let "var=var+1"
let "var+=1"
let "var++"
Ada cara lain juga. Misalnya, terlihat dalam jawaban lain atas pertanyaan ini.
let var++
var=$((var++))
((++var))
{
declare -i var
var=var+1
var+=1
}
{
i=0
i=$(expr $i + 1)
}
Memiliki begitu banyak pilihan yang mengarah ke dua pertanyaan ini:
#!/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
Tampaknya bash adalah tercepat di drama i+=1
ketika $i
dinyatakan sebagai integer. membiarkan
pernyataan yang tampaknya sangat lambat, dan expr
adalah jauh yang paling lambat karena tidak builtin.
Ada's juga ini:
var=`expr $var + 1`
Mengambil catatan hati-hati ruang-ruang dan juga ` tidak '
Sementara Radu's jawaban, dan komentar, yang lengkap dan sangat membantu, mereka bash-spesifik. Saya tahu anda lakukan secara khusus bertanya tentang bash, tapi saya pikir saya'd pipa sejak saya menemukan pertanyaan ini ketika saya sedang mencari untuk melakukan hal yang sama menggunakan busybox sh di bawah uCLinux. Portable ini di luar bash.
Jika anda menyatakan $var
sebagai integer, maka apa yang anda mencoba untuk pertama kalinya benar-benar akan bekerja:
$ declare -i var=5
$ echo $var
5
$ var=$var+1
$ echo $var
6
Referensi: Jenis variabel, Bash Panduan untuk Pemula
Ada's salah satu metode yang hilang di semua jawaban - bc
$ VAR=7
$ bc <<< "$VAR+2"
9
$ echo $VAR
7
$ VAR=$( bc <<< "$VAR+1" )
$ echo $VAR
8
sm
ditentukan oleh POSIX standar, jadi harus hadir di semua versi Ubuntu dan POSIX-compliant sistem. The <<<
pengalihan bisa diubah ke echo "$VAR" | bc
untuk portabilitas, tapi karena pertanyaan menanyakan tentang bash
- it's OK untuk hanya menggunakan <<<
.
Kode kembali 1
masalah hadir untuk semua default varian (membiarkan
, (())
, dll.). Hal ini sering menyebabkan masalah, misalnya, di script yang menggunakan set-o errexit
. Berikut adalah apa yang saya gunakan untuk mencegah kesalahan kode 1
dari ekspresi matematika yang mengevaluasi ke 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
Hal ini telah menjadi cara terburuk untuk menyelesaikan suatu tugas sederhana tapi aku hanya ingin dokumen itu untuk menyenangkan saya kira (kebalikan dari kode golf).
$ var=0
$ echo $var
0
$ var="$(python -c 'print('$var'+1)')"
$ echo $var
1
atau
$ var="$(printf '%s\n' $var'+1' | bc)"
$ echo $var
1
Serius menggunakan salah satu dari banyak pilihan yang lebih baik di sini.