Intereting Posts
Как указать тот же порядок для кнопок «ОК» и «Отмена» в приложениях KDE и GNOME? Назначить фоновый процесс subshell pid переменной В чем разница между использованием netcat (nc) и curl для HTTP-запросов? Надежное зеркало CDN для debian? Есть ли стандарт, как команды, запускающие другие команды, обрабатывают конструкции оболочки как перенаправления? Отображение системной информации без мерцания Как я могу настроить другую версию Python из ОС? Как создать псевдоним, который принимает аргумент в KornShell Как я могу дать permssion для всех пользователей для пути, использующего восьмеричную нотацию? Как автоматически загружать новый VID и PID в модуль usb_serial Как связать несвязанные файлы? Как посчитать количество строк, в которых есть данные в файле с разделителями канала? Что контролирует домашний каталог в таких приложениях, как Geeqie и Thunar? Что делает GNOME с мультимедийными клавишами? скрипт запуска linux / etc / init с конкретным пользователем

Чтение из файла с целочисленными значениями в каждой отдельной строке, а затем при выполнении условия выполнить инструкцию

У меня есть текстовый файл, который имеет только целочисленные значения, т.е. разные целые числа в разных строках (скажем, от 1 до 47). Я сделал скрипт, который будет читать каждую строку и принимать значение, представленное в другой строке. Если условие выполнено, я хочу повторить заявление.

содержимое a.txt : (в одной строке только 1, во второй строке только 2, как есть) 1 2 3 4 5 .. до 47.

Вывод, который я хочу: Как только он будет читать 5. Вывод – «Шаг завершен, 5» (без двойных кавычек). Это должно идти на 5,10,15,20 до 45

Вот код, но он не работает.

#!/bin/bash while IFS= read -r line; do if [[ $line=="5" ]] ; then echo "Step Completed is:" $var fi done < "$1" 

Также я хочу повторить одно и то же утверждение для каждых 5 целочисленных значений, т.е. как только скрипт прочитает 5, он должен повторить – Шаг завершен равен 5. Как только он прочитает 10, он должен повторить – Шаг завершен равен 10. Вот так.

Для запуска скрипта я использую команду:

 . ./al.sh a.txt 

Вместо того, чтобы делать это в сценарии оболочки, я бы предложил сделать это с помощью awk :

 awk '$1 % 5 == 0 { last_step = $1 } END { printf("Step %s completed\n", last_step ) }'  

Это делает код коротким, быстрым и простым. Код awk хранит каждое кратное 5, найденное во входных данных, и в конце печатает последнее найденное такое число.

Тестирование (в оболочке с расширениями скобок):

 $ printf '%s\n' {1..47} | awk '$1 % 5 == 0 { last_step = $1 } END { printf("Step %s completed\n", last_step ) }' Step 45 completed 

Эквивалентный цикл оболочки будет выглядеть

 while read number; do if [ "$(( number % 5 ))" -eq 0 ]; then last_step=$number fi done  

Возможно, вы захотите вставить тест, чтобы убедиться, что last_step имеет допустимое значение, прежде чем делать какие-либо выходные данные, или вы получите фиктивный вывод, если ваш ввод не содержит кратных пяти.

Если вы хотите вывести «шаг завершен» на все 5 строк, то берется оставшаяся часть шага, когда она делится на 5 и сравнивается с 0:

 #!/bin/bash while IFS= read -r line; do if [[ $(( line %5 )) -eq 0 ]] ; then echo "Step Completed is: $line" fi done < "$1" 

(не то, что в вашем скрипте ваша переменная называется line или var ....)

Если вы хотите только последнюю такую ​​строку, то вам придется ждать до конца, чтобы напечатать ее. Если у вас есть полная последовательность чисел, вы можете вычислить ее в конце:

 #!/bin/bash while IFS= read -r line; do # do whatever for the line echo $line >/dev/null done < "$1" echo "Step completed is: $(( 5 * ( line % 5 ) ))" 

В противном случае просто запомните последнее, что вы видели:

 #!/bin/bash while IFS= read -r line; do [[ $(( line %5 )) -eq 0 ]] && line5=$line # do whatever for the line done < "$1" [[ ! -z "$line5" ]] && echo "Step completed is: $line5"