Não quero necessariamente a resposta, mas se alguém puder me apontar alguma literatura ou exemplos. Eu gostaria de descobrir isso.
Quando executo o script, recebo um erro:
Erro de sintaxe próximo token inesperado
fi
Deduzi que meu problema está em minha if
declaração fazendo if
comentários e adicionando echo "$NAME"
quais exibem os nomes no /etc/
.
Quando faço alterações, removo #
de if
e fi
adiciono #
a wc -c "$NAME"
, recebo o erro de sintaxe listado acima. Eu adicionei ;
entre ]
então. Também mudei then
para a próxima linha sem resolução.
#!/bin/bash
for NAME in /etc/*
do
if [ -r "$NAME" -af "$NAME" ] then
wc -c "$NAME"
fi
done
-af
deveria fazer?-a
é redundante porque a condição já está incluída-f
. --- De qualquer forma, várias condições[ ]
(este comando também está disponível comotest
) precisam ser unidas usando operadores lógicos como-a
(e) ou-o
(ou), mas como foi sugerido na resposta abaixo, é melhor usar vários comandos[ ]
(test
) e associar usando operadores de shell como&&
ou||
.Respostas:
Palavras-chave como
if
,then
,else
,fi
,for
,case
e assim por diante necessidade de estar em um lugar onde a Shell espera um nome de comando. Caso contrário, eles são tratados como palavras comuns. Por exemplo,apenas imprime
if
, não inicia uma instrução condicional.Assim, na linha
a palavra
then
é um argumento do comando[
(do qual reclamaria se alguma vez fosse executado). O shell continua procurando othen
e encontra umafi
posição de comando. Como há umif
que ainda está procurandothen
, ofi
é inesperado, há um erro de sintaxe.Você precisa colocar um terminador de comando antes
then
para que seja reconhecido como uma palavra-chave. O terminador de comando mais comum é uma quebra de linha, mas antesthen
, é comum usar um ponto-e-vírgula (que tem exatamente o mesmo significado que uma quebra de linha).ou
Depois de corrigir isso, você receberá outro erro do comando
[
porque ele não entende-af
. Você provavelmente quis dizerEmbora os comandos de teste pareçam opções, você não pode agrupá-los dessa maneira. Eles são operadores do
[
comando e precisam ser cada um uma palavra separada (como faça[
e]
).A propósito, embora
[ -r "$NAME" -a -f "$NAME" ]
funcione, eu recomendo escreverou
É melhor manter
[ … ]
condicionais simples, porque o[
comando não pode distinguir operadores de operando facilmente. Se$NAME
parecer com um operador e aparecer em uma posição em que o operador é válido, ele poderá ser analisado como operador. Isso não acontecerá nos casos simples vistos nesta resposta, mas casos mais complexos podem ser arriscados. Escrever isso com chamadas separadas[
e usar os operadores lógicos do shell evita esse problema.A segunda sintaxe usa a
[[ … ]]
construção condicional existente no bash (e ksh e zsh, mas não sh simples). Esta construção é sintaxe especial, enquanto[
é analisado como qualquer outro comando, assim você pode usar coisas como&&
dentro e você não precisa variáveis cotação exceto em argumentos para alguns operadores de cordas (=
,==
,!=
,=~
) (ver Quando é colocar aspas necessário ? para detalhes).fonte
if [[ 1 ]] then [[ 2 ]] fi
funciona em ksh, pdksh e zsh.if(:)then(:)fi
funciona em todas as conchas.Veja o que mudou da seguinte forma
Se você deseja remover todos os comandos no bloco if, é necessário adicionar pelo menos dois pontos, como
ou versão de uma linha
if [ -r "$NAME" -a -f "$NAME" ]; then :; fi
fonte
Outros já apontaram, mas se você estiver procurando por referência oficial, o RTM
Está faltando o
;
E a sintaxe para
list
é descrita emman test
fonte