asla -a veya -o operatörünü ``


11

Stéphane Chazelas şunu yazdı:

gibi birkaç kural

  • her zaman değişkenleri alıntıla
  • asla -aveya -ooperatörünü kullanmayın (birkaç [komut ve &&ve ||kabuk işleçlerini kullanın)

[POSIX mermileriyle güvenilir olun .

Neden " -aveya -ooperatörünü asla kullanmıyorsunuz ?"

"Birkaç [komut ve &&ve ||kabuk işleçlerini kullan)" nasıl yapabilirim ?

Yanıtlar:


13

Neden " -aveya -ooperatörünü asla kullanmıyorsunuz ?"

Çünkü belirsiz olabilirler ve dolayısıyla POSIX uyumlu değildirler :

-A ve -o ikili primerlerini ve '(' ve ')' operatörlerini belirten XSI uzantıları eskimiş olarak işaretlenmiştir. (Bunları kullanan birçok ifade, değerlendirilen belirli ifadelere bağlı olarak dilbilgisi tarafından belirsiz bir şekilde tanımlanır.) Bu ifadeleri kullanan komut dosyaları, aşağıdaki formlara dönüştürülmelidir. Birçok uygulama bu eski formları desteklemeye devam etse de, komut dosyaları, bunlar ve diğer primerler ve operatörlerle karıştırılabilecek kullanıcı tarafından sağlanan girdilerle uğraşırken son derece dikkatli olmalıdır. Uygulama geliştiricisi betiğe girdi oluşturan tüm durumları bilmiyorsa, aşağıdaki gibi çağrılar yapılır:

test "$1" -a "$2"

şu şekilde yazılmalıdır:

test "$1" && test "$2"

"Birkaç [komut ve &&ve ||kabuk işleçlerini kullan)" nasıl yapabilirim ?

Birden fazla test yaparak ve bunları adı geçen operatörleri kullanarak zincirleyerek; Örneğin:

[ 0 -eq 0 -a \( 0 -eq 1 -o 1 -eq 1 \) ]

eşdeğer olarak yeniden yazılabilir:

[ 0 -eq 0 ] && ([ 0 -eq 1 ] || [ 1 -eq 1 ])

ya da daha iyisi:

[ 0 -eq 0 ] && { [ 0 -eq 1 ] || [ 1 -eq 1 ]; }

Teşekkürler. (1) "'(' ve ')' operatörleri eskimiş olarak işaretlenmiştir". Var (ve )komutları gruplandıran işleçler? Eğer eskimişlerse, ikameleri nelerdir? (2) test "$1" -a "$2"Değiştirilmeli test "$1" && test "$2"veya değiştirilmeli ((test "$1" && test "$2"))mi? İhtiyacımız yok ((..))mu?
Tim

@Zaman Güncellemeye bakın. (1) Evet - ()ve {}yerine kullanabilirsiniz. (2) Birincisi; (())aritmetik genişleme için kullanılır, burada test zincirinin çıkış durumunu test etmek istersiniz, bu yüzden testleri bir alt kabukta ()veya geçerli kabukta gruplayın {}.
kos

Teşekkürler. Sorularımın bu yayının ötesine geçebileceğini düşünüyorum. Bu yüzden onları yeni bir gönderiye gönderiyorum.
Tim

1
Kullanmak tek nedeni @Tim (ve )kullandığınız zaman operatörleri edilir -aveya -o. İkincisi eskimiş olduğundan, ilki de artık gerekli değildir.
Barmar
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.