bash -e, let veya expr 0 olarak değerlendirildiğinde çıkar


19

Ben komut dosyası herhangi bir çıkış durumu! = 0 çıkacaktır böylece -e ayarlar bir bash komut dosyası var.

Değişkenlere atanan bazı temel kabuk aritmetik yapmaya çalışıyorum ve bazen ifade izin veya ifade komutunun çıkış durumu "1" neden 0 eşittir.

İşte bir örnek:

#!/bin/bash -ex
echo "Test 1"
Z=`expr 1 - 1` || true
echo "Z will print"
let "A=4 - 4"
echo "A WILL NEVER PRINT $A"
Y=`expr 1 - 1`
echo "Y WILL NEVER PRINT $Y"
X=$(expr 2 - 2)
echo "X WILL NEVER PRINT $X"

Çıktı:

$ ./test_error.sh 
+ echo 'Test 1'
Test 1
++ expr 1 - 1
+ Z=0
+ true
+ echo 'Z will print'
Z will print
+ let 'A=4 - 4'

Benim sorum komut dosyası gerçek çıkış hataları ve temel aritmetik eşit 0 başarısız değil izin vermek için deyimsel bash komut dosyası yolu nedir. Ben tüm bu ifadeler ile son ek olabilir:

A=`expr $C - $D`    || true

Ama bu acayip görünüyor.

Yanıtlar:


16

exprAritmetik için kullanmayın . Uzun zamandır modası geçmişti: mermiler artık $((…))yapıyla (POSIX) ya da letyerleşik (ksh / bash / zsh) ya da ((…))yapı (ksh / bash / zsh) ile aritmetiğe sahip .

letve ((…))en son değerlendirilen ifade 0 ise 1 (bir hata durum kodu) döndürün. Betiğinizin altından çıkmasına neden olmaktan kaçınmak set -eiçin, son ifadenin 0 döndürmemesini sağlayın , örneğin:

let "a = 2 - 2" 1
((a = 2 - 2, 1))

Alternatif olarak, || truedeyimi kullanın :

((a = 2 - 2)) || true

Alternatif olarak, aritmetiğinizi içeride $((…))ve ödevlerinizi dışarıda yapın. Bir atama, değerdeki son komut ikamesinin durumunu veya komut ikamesi yoksa 0 değerini döndürür, böylece güvendesiniz. Bu, herhangi bir POSIX kabuğunda (çizgi gibi) çalışma avantajına sahiptir.

a=$((2 - 2))

1

$(( $C - $D ))Bunun yerine aritmatik için kullanın . Aynı zamanda daha verimlidir.


Söylemekten daha verimli yapan nedir (( A = $C - $D ))?
piskopos

1

Ben de aynı problemi yaşadım . tl; dr:

Son ARG [let] ifadesi 0 olarak değerlendirilirse, 1 döndürür; aksi halde 0 döndürür.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.