No necesariamente quiero la respuesta, pero si alguien pudiera señalarme literatura o ejemplos. Me gustaría resolverlo.
Cuando ejecuto el script recibo un error:
Error de sintaxis cerca de token inesperado
fi
He deducido que mi problema está en mi if
declaración al hacer mis if
comentarios de declaraciones y agregar lo echo "$NAME"
que muestra los nombres en el /etc/
.
Cuando hago cambios, retire el #
de if
y fi
y añadir #
a wc -c "$NAME"
, recibo el error de sintaxis que se enumeran más arriba. He agregado ;
entre ]
entonces. También me he movido then
a la siguiente línea sin resolución.
#!/bin/bash
for NAME in /etc/*
do
if [ -r "$NAME" -af "$NAME" ] then
wc -c "$NAME"
fi
done
-af
supone que debe hacer?-a
es redundante porque la condición ya está incluido dentro-f
. --- De todos modos múltiples condiciones dentro[ ]
(este comando también está disponible comotest
) que se unió a la utilización de operadores lógicos, como-a
(y) o-o
(o), sino como se sugirió en la respuesta de abajo es mejor uso múltiple[ ]
(test
) y unirse a los comandos utilizando operadores de shell como&&
o||
.Respuestas:
Palabras claves como
if
,then
,else
,fi
,for
,case
y así sucesivamente necesidad de estar en un lugar donde la cáscara espera un nombre de comando. De lo contrario, se tratan como palabras ordinarias. Por ejemplo,solo imprime
if
, no comienza una instrucción condicional.Por lo tanto, en la línea
la palabra
then
es un argumento del comando[
(del cual se quejaría si alguna vez llegara a ejecutarse). El shell sigue buscando elthen
, y encuentra unafi
posición de comando. Como hay unaif
que todavía está buscando suthen
,fi
es inesperado, hay un error de sintaxis.Debe poner un terminador de comando antes
then
para que se reconozca como una palabra clave. El terminador más común de comandos es un salto de línea, pero antesthen
, es común el uso de un punto y coma (que tiene exactamente el mismo significado que un salto de línea).o
Una vez que solucione eso, obtendrá otro error del comando
[
porque no lo comprende-af
. Probablemente quisiste decirAunque los comandos de prueba parecen opciones, no puede agruparlos así. Son operadores del
[
comando y deben ser cada una una palabra separada (como do[
y]
).Por cierto, aunque
[ -r "$NAME" -a -f "$NAME" ]
funciona, recomiendo escribiro
Es mejor mantener los
[ … ]
condicionales simples porque el[
comando no puede distinguir a los operadores del operando fácilmente. Si$NAME
se parece a un operador y aparece en una posición donde el operador es válido, se pudo analizar como un operador. Esto no sucederá en los casos simples visto en esta respuesta, pero los casos más complejos puede ser arriesgado. Escribir esto con llamadas separadas[
y usar los operadores lógicos del shell evita este problema.La segunda sintaxis utiliza el
[[ … ]]
constructo condicional que existe en bash (y ksh y zsh, pero no sh llano). Esta construcción se sintaxis especial, mientras[
se analiza como cualquier otro comando, así que puede usar cosas como&&
el interior y que no es necesario que las variables de cotización, salvo en los argumentos de algunos operadores de cadena (=
,==
,!=
,=~
) (ver ¿Cuándo es necesario citar doble ? para más detalles).fuente
if [[ 1 ]] then [[ 2 ]] fi
en cuenta que funciona en ksh, pdksh y zsh.if(:)then(:)fi
Funciona en todos los depósitos.Vea lo que ha cambiado de la siguiente manera
Si desea eliminar todos los comandos de si el bloque, que al menos necesidad de añadir dos puntos en ella, como
o una versión de línea
if [ -r "$NAME" -a -f "$NAME" ]; then :; fi
fuente
Otros ya lo señalaron, pero si está buscando una referencia oficial, entonces RTM
Te estás perdiendo el
;
Y la sintaxis para
list
se describe enman test
fuente