Test POSIX i -a

9

Sprawdziłem mój skrypt za pomocą checkbashism i otrzymałem następujące ostrzeżenia:

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

W sekcji 4.62.4 specyfikacji POSIX znajduję

pierwszorzędny -a pierwotny Wykonuje plik binarny oraz wyniki pierwotny i pierwotny. Operator -a ma pierwszeństwo przed operatorem -o.

Dlaczego są -ai są -ouważane za nieprzenośne?

Matteo
źródło

Odpowiedzi:

11

Nie jest tak bardzo, że nie jest przenośny, ale że nie ma [implementacji, w której byłby wiarygodny, gdy przekazano więcej niż 4 argumenty.

Nawet w bash:

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

Powiązana sekcja stwierdza:

> 4 argumenty :

Wyniki nie są określone.

[OB XSI] [Opcja Start] W systemach zgodnych z XSI, kombinacje elementów pierwotnych i operatorów należy oceniać przy użyciu opisanych wcześniej zasad pierwszeństwa i asocjatywności. Ponadto binarne łańcuchy pierwotne porównania ciągów „=” i „! =” Mają wyższy priorytet niż jakikolwiek jednoargumentowy łańcuch podstawowy. [Koniec opcji]

-ai -opowinien zostać zbanowany. Właściwym sposobem jest użycie zamiast tego operatorów &&i || powłoki :

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

Uważam to nawet za bardziej czytelne.

Stéphane Chazelas
źródło
Dzięki, więc jedynym rozwiązaniem byłyby dwa testy? `if [-n" $ {ALTNAMES}]] && [-n "$ {COMMON_NAME}];
Matteo,
3
Nie jedyny, ale z pewnością najlepszy i zalecany jako zamiennik -ai-o
Stéphane Chazelas
Ok, wielkie dzięki (z tym, że tylko miałem na myśli, że nie ma sposobu, aby mieć jeden test ...).
Matteo,
1
Tak, możesz to zrobić [ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](nadal nieokreślony zgodnie z POSIX, ale przenośny i niezawodny) lub[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
Stéphane Chazelas,