
for (( a=1;a<=$(wc -l sedtest1);a++ ));do echo $a; done
Выдает ошибку:
-bash: ((: a<=21 sedtest1: syntax error in expression (error token is "sedtest1")
решение1
Вывод wc -l sedtest1
будет примерно таким:
21 sedtest1
Таким образом, тест станет чем-то вроде того, a <= 21 sedtest1
что является недействительным.
Также это означает, что wc
команда будет выполняться для каждой итерации цикла. Если содержимое файла sedtest1
не меняется между каждой итерацией, лучше сначала сохранить это количество строк в переменной вне цикла:
n=$(wc -l < sedtest1) # using redirection avoids the output containing the filename
for ((a = 0; a < n; a++)); do echo "$a"; done
Я также подозреваю, что вы пытаетесь использовать цикл для обработки текста неэффективным и не shell-способом. Вы можете прочитатьПочему использование цикла оболочки для обработки текста считается плохой практикой?. Подобный цикл по каждой строке файла — неверный подход.
решение2
Неважно, я просто был невероятно глуп...
wc -l file
выводит как «x file».
Все, что мне нужно было сделать, это:
for (( a=1;a<=$(wc -l sedtest1|awk '{print $1}');a++ ));do echo $a; done