
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 inesperado
fi
He deducido que mi problema está en mi if
declaración haciendo if
comentarios en mis declaraciones y agregando echo "$NAME"
que muestra los nombres en el archivo /etc/
.
Cuando hago cambios, elimino #
from if
y fi
agrego #
a wc -c "$NAME"
, recibo el error de sintaxis que mencioné anteriormente. He añadido ;
entre ]
entonces. También pasé 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
Respuesta1
Las palabras clave como if
, then
, else
, fi
, for
etc. case
deben 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 then
es un argumento del comando [
(del que se quejaría si alguna vez se ejecutara). El shell sigue buscando then
y encuentra una fi
posición de comando. Como hay un if
mensaje que todavía está buscándolo then
, fi
es inesperado y hay un error de sintaxis.
Debe colocar un terminador de comando antes then
para 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 $NAME
parece 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 paralist
se describe enman test