La sustitución de comandos no funciona dentro de la condición de bucle

La sustitución de comandos no funciona dentro de la condición de bucle

for (( a=1;a<=$(wc -l sedtest1);a++ ));do echo $a; done

Me da un error:

-bash: ((: a<=21 sedtest1: syntax error in expression (error token is "sedtest1")

Respuesta1

La salida de wc -l sedtest1será algo como:

21 sedtest1

Entonces la prueba se convertirá en algo así a <= 21 sedtest1como inválido.

Además, eso significa que el wccomando se ejecutará para cada iteración del bucle. Si el contenido del sedtest1archivo no cambia entre cada iteración, sería mejor guardar ese número de líneas primero en una variable fuera del bucle:

n=$(wc -l < sedtest1) # using redirection avoids the output containing the filename
for ((a = 0; a < n; a++)); do echo "$a"; done

También sospecho que estás intentando utilizar un bucle para procesar texto de una forma ineficiente y sin shell. Quizás quieras leer¿Por qué se considera una mala práctica utilizar un bucle de shell para procesar texto?. Recorrer cada línea de un archivo de esa manera no es el camino correcto a seguir.

Respuesta2

No importa, estaba siendo increíblemente estúpido... wc -l filelos resultados son "archivo x".

Todo lo que tenía que hacer era esto: for (( a=1;a<=$(wc -l sedtest1|awk '{print $1}');a++ ));do echo $a; done

información relacionada