Teste POSIX e -a

9

Eu verifiquei um script meu com checkbashisms e recebi os seguintes avisos:

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

Na seção 4.62.4 das especificações POSIX , acho

primário - um primário Executa um binário e os resultados de primário e primário. O operador -a tem precedência sobre o operador -o.

Por que -ae -oconsiderado não portátil?

Matteo
fonte

Respostas:

11

Não é tanto que não seja portátil, mas que não há [implementação em que seja confiável quando passados ​​mais de 4 argumentos.

Mesmo no bash:

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

A seção relacionada declara:

> 4 argumentos :

Os resultados não são especificados.

[OB XSI] [Opção Iniciar] Em sistemas em conformidade com XSI, as combinações de primárias e operadores devem ser avaliadas usando as regras de precedência e associatividade descritas anteriormente. Além disso, as primárias binárias da comparação de cadeias '=' e "! =" Devem ter uma precedência mais alta do que qualquer primário primário unário. [Fim da opção]

-ae -odeve ser banido. O caminho certo é usar os operadores &&e || shell :

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

Eu até acho isso mais legível.

Stéphane Chazelas
fonte
Obrigado, então a única solução seria ter dois testes? `if [-n" $ {ALTNAMES} "] && [-n" $ {COMMON_NAME}];
Matteo
3
Não é o único, mas certamente o melhor e recomendado como um substituto para -ae-o
Stéphane Chazelas 7/12/12
Ok, muito obrigado (com apenas eu quis dizer que não há como fazer um único teste ...).
Matteo
1
Sim, você poderia fazer [ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](ainda não especificado de acordo com o POSIX, mas portátil e confiável), ou[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
Stéphane Chazelas