Error de sintaxis cerca del token inesperado "fi"

Error de sintaxis cerca del token inesperado "fi"

No necesariamente quiero la respuesta, pero si alguien pudiera indicarme alguna literatura o ejemplos. Me gustaría resolverlo.

Cuando ejecuto el script recibo un error:

Error de sintaxis cerca del token inesperadofi

He deducido que mi problema está en mi ifdeclaración haciendo ifcomentarios en mis declaraciones y agregando echo "$NAME"que muestra los nombres en el archivo /etc/.

Cuando hago cambios, elimino #from ify fiagrego #a wc -c "$NAME", recibo el error de sintaxis que mencioné anteriormente. He añadido ;entre ]entonces. También pasé thena 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

Respuesta1

Las palabras clave como if, then, else, fi, foretc. casedeben estar en un lugar donde el shell espera un nombre de comando. De lo contrario, se tratan como palabras ordinarias. Por ejemplo,

echo if

simplemente imprime if, no inicia una instrucción condicional.

Así, en la línea

if [ -r "$NAME" -af "$NAME" ] then

la palabra thenes un argumento del comando [(del que se quejaría si alguna vez se ejecutara). El shell sigue buscando theny encuentra una fiposición de comando. Como hay un ifmensaje que todavía está buscándolo then, fies inesperado y hay un error de sintaxis.

Debe colocar un terminador de comando antes thenpara que se reconozca como una palabra clave. El terminador de comando más común es un salto de línea, pero antes then, es común usar un punto y coma (que tiene exactamente el mismo significado que un salto de línea).

if [ -r "$NAME" -af "$NAME" ]; then

o

if [ -r "$NAME" -af "$NAME" ]
then

Una vez que solucione eso, obtendrá otro error del comando [porque no comprende -af. Probablemente quisiste decir

if [ -r "$NAME" -a -f "$NAME" ]; then

Aunque los comandos de prueba parecen opciones, no puedes agruparlos así. Son operadores del [comando y cada uno debe ser una palabra separada (como do [y ]).

Por cierto, aunque [ -r "$NAME" -a -f "$NAME" ]funciona, recomiendo escribir cualquiera de los dos.

[ -r "$NAME" ] && [ -f "$NAME" ]

o

[[ -r $NAME && -f $NAME ]]

Es mejor mantener [ … ]los condicionales simples porque el [comando no puede distinguir fácilmente los operadores del operando. Si $NAMEparece un operador y aparece en una posición donde el operador es válido, podría analizarse como un operador. Esto no sucederá en los casos simples que se ven en esta respuesta, pero los casos más complejos pueden ser riesgosos. Escribir esto con llamadas separadas [y usar los operadores lógicos del shell evita este problema.

La segunda sintaxis utiliza la [[ … ]]construcción condicional que existe en bash (y ksh y zsh, pero no en sh simple). Esta construcción tiene una sintaxis especial, mientras que se [analiza como cualquier otro comando, por lo que puede usar cosas como &&dentro y no necesita citar variables, excepto en los argumentos de algunos operadores de cadena ( ,,,, =) (consulte==!==~¿Cuándo son necesarias las comillas dobles?para detalles).

Respuesta2

Vea lo que ha cambiado de la siguiente manera

si [ -r "$NOMBRE"-a -f"$NOMBRE" ];entonces
# ^^^^^ ^
     wc -c "$NOMBRE"
fi

Si desea eliminar todos los comandos en el bloque if, al menos necesita agregar dos puntos, como

if [ -r "$NAME" -a -f "$NAME" ]; then
    :
fi

o versión de una línea

if [ -r "$NAME" -a -f "$NAME" ]; then :; fi

Respuesta3

Otros ya lo señalaron, pero si buscas una referencia oficial entoncesRTM

si lista; luego enumere; [lista elif; luego enumere; ] ... [ más lista;] fi

Se ejecuta la lista if. Si su estado de salida es cero, se ejecuta la lista. De lo contrario, cada lista elif se ejecuta a su vez y, si su estado de salida es cero, se ejecuta la lista correspondiente y se completa el comando. De lo contrario, se ejecuta la lista else, si está presente. El estado de salida es el estado de salida del último comando ejecutado, o cero si ninguna condición resultó ser verdadera.

te falta el;

Y la sintaxis paralistse describe enman test

información relacionada