Beberapa perintah terkait aritmatika, Dash, shell POSIX, sh, Increment

17

Ketika pra / post menambah variabel, dalam POSIX Shell, apa perbedaan antara dua contoh ini. Mereka sepertinya memiliki konsekuensi yang sama, tetapi apakah mereka akan digunakan secara berbeda? Kapan Anda lebih suka yang satu daripada yang lain?

X=$((X+1))

: $((X=X+1))
JM Becker
sumber

Jawaban:

18

Dalam contoh pertama Anda, $((X+1))evaluasi ekspresi X + 1 dan perluas hasilnya, yang kemudian dikaitkan ke variabel.

Dalam contoh kedua, $((X=X+1))penambahan Xsatu ( $((X++))juga valid dan lebih pendek, tetapi tidak harus didukung oleh shell), kemudian diperluas ke nilai baru $X, yang merupakan argumen pertama ke perintah nol :,. Perintah nol mengabaikan argumennya, dan hasilnya dibuang (dengan efek samping).

Saya pribadi lebih suka bentuk pertama karena tiga alasan (relatif subyektif):

  • Perintah nol tidak jelas dan disalahpahami, seperti yang ditunjukkan dengan seringnya menjadi subjek pertanyaan yang membingungkan di sini.
  • Bentuk pertama tampaknya lebih alami dalam hal tata bahasa shell secara keseluruhan, dan bahkan sedikit menyerupai gaya evaluasi lama.
  • Bentuk pertama lebih jelas dan lebih ringkas dan tidak melibatkan perintah.

Anda harus menggunakan versi pertama jika Anda memodifikasi lingkungan hanya dari satu perintah seperti

X=$((X+1)) /usr/local/bin/something

Anda harus menggunakan formulir kedua untuk menambahkan evaluasi ke argumen secara langsung:

ls -la "file-$((X++))"   # or ...
ls -la "file-$((X=X+1))" # for better compatibility

Ini memiliki efek samping yang diinginkan, menghemat satu baris, dan cukup jelas.

Alexios
sumber