POSIX testi ve -a


9

Bir senaryomu kontrol banyolarıyla kontrol ettim ve aşağıdaki uyarıları aldım:

possible bashism in check_ssl_cert line 821 (test -a/-o):
if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then

In POSIX gözlük bölüm 4.62.4 I find

birincil -a birincil Bir ve ikili ve birincil ve birincil sonuçlarını gerçekleştirir. -A operatörünün -o operatörüne göre önceliği vardır.

Neden edilir -ave -oolmayan taşınabilir kabul?

Yanıtlar:


11

Taşınabilir olmadığı kadar fazla değil, ancak [4'ten fazla argüman iletildiğinde güvenilir olduğu bir uygulama yok .

Bash'ta bile:

$ ALTNAMES='='  bash -c '[ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ]'
bash: line 0: [: too many arguments

İlgili bölüm şunları belirtmektedir:

> 4 argüman :

Sonuçlar belirtilmedi.

[OB XSI] [Seçenek Başlatma] XSI uyumlu sistemlerde, primerlerin ve operatörlerin kombinasyonları daha önce açıklanan öncelik ve ilişkilendirilebilirlik kuralları kullanılarak değerlendirilmelidir. Ek olarak, '=' ve "! =" Dize karşılaştırma ikili primerlerinin herhangi bir tekli primerden daha yüksek önceliği olacaktır. [Seçenek Sonu]

-ave -oyasaklanmalıdır. Doğru yol, &&ve || kabuk operatörlerini kullanmaktır:

if [ -n "$foo" ] && [ -n "$bar" ]; then

Hatta daha okunaklı buluyorum.


Teşekkürler, bu yüzden tek çözüm iki test yaptırmak mı? `eğer [-n" $ {ALTNAMES} "] && [-n" $ {COMMON_NAME}] ise;
Matteo

3
Değil sadece bir değil kesinlikle iyi ve bir yedek olarak önerilen -ave-o
Stéphane Chazelas

Tamam çok teşekkürler (sadece ben tek bir test yapmanın bir yolu yok demekti ...).
Matteo

1
Evet, yapabilirsin [ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ]( [ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
POSIX'e göre

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.