Provavelmente tenho erros de sintaxe no seguinte snippet de shell (POSIX):
#!/bin/sh
if tput setaf >/dev/null 2>&1; then tput_init_linux else tput_init_none;
elif tput AF >/dev/null 2>&1; then tput_init_bsd else tput_init_none;
else tput_init_none; fi
ShellCheck 0.10.0 não diz nada sobre isso, descobri basicamente por acidente.
Eu testei da seguinte forma:
if tput setaf >/dev/null 2>&1; then tput_init_linux else tput_init_none; fi
tudo correu bem:
tput_init_linux: command not found
Revertendo a lógica com
!
:if ! tput setaf >/dev/null 2>&1; then tput_init_linux else tput_init_none; fi
não diz nada , mas se eu adicionar um ponto e vírgula:
if ! tput setaf >/dev/null 2>&1; then tput_init_linux; else tput_init_none; fi
parece funcionar conforme o esperado:
tput_init_none: command not found
Mas pareço ser incapaz de encadear essas if
declarações múltiplas posteriormente.
Como você pode ver, cheguei a um estado em que uma instrução funciona, mas encadeá-la parece problemático . Alguém pode ajudar?
Você tem dois erros de sintaxe. Primeiro, é necessário um ponto e vírgula ou uma nova linha. Isso está errado 1 :
Mas estes estão corretos:
ou
Em seguida, o
if/elif/else/fi
é aberto peloif
e fechado peloelse
seguido pelofi
. Oelif
único fica no meio e você pode ter muitos deles, mas apenas umelse
. Portanto, sua tentativa é confusa:Como cada par if/else é binário, não tenho certeza de como você os encadearia. Agora, acho que o que você quer fazer é só correr
tput_init_none
se nemtput setaf
funcionartput AF
. Se sim, você faria:Ou, a mesma coisa:
Basicamente, você pode encadear quantos
if/elif
quiser, mas só pode haver umelse
. Aelse
é a condição de fallback final que será executada se ambosif
e todoselif
falharem.1 Mais precisamente, isso é apenas um "erro de sintaxe" no sentido de que essa sintaxe não faz o que você deseja. Na verdade, é uma sintaxe perfeitamente válida, mas significa "executar o comando
command1
com os argumentoselse
ecommand2
. Como essa é uma sintaxe realmente válida, o shellcheck não a captará, mas não fará o que você espera:Então você pode pensar nisso como
if true; then echo "TRUE" "else" "echo" "FALSE"; fi
.