Использование цикла do while в Linux для возврата определенных значений

В общем, это невозможно, как объяснялось в нескольких других ответах.

Однако оболочки Unix являются обычными программами (, и они интерпретируют командную строку и подставляют ее, то есть расширяют команду перед выполнением forkи execveдля нее ). См. это объяснение bashопераций оболочки . Вы можете написать свою собственную оболочку(или исправить некоторые существующие свободные программы , например. GNU bash)и использовать его в качестве оболочки (или даже оболочки входа в систему, см. passwd (5)и оболочки (5)).

Например, у вас может быть ваша собственная программа-оболочка, поместившая полную командную строку в какую-нибудь переменную окружения (представьте себе MY_COMMAND_LINEнапример)-или используйте любой другой вид inter -связь процесса для передачи командной строки из оболочки в дочерний процесс -.

Я не понимаю, зачем вам это нужно, но вы можете запрограммировать оболочку, ведущую себя таким образом (, но я не рекомендую этого делать ).

Кстати, программа может быть запущена некоторой программой, которая не оболочка (, но которая выполняет fork (2 ), затем execve (2 ),или просто execveдля запуска программы в ее текущем процессе ). В таком случае вообще нет командной строки, и ваша программа может быть запущена без команды...

Обратите внимание, что у вас может быть (специализированная )система Linux без установленной оболочки. Это странно и необычно, но возможно. Затем вам нужно будет написать специализированную программу инициализации , запускающую другие программы по мере необходимости -без использования какой-либо оболочки, но с помощью forkи execveсистемных вызовов.

Читайте такжеОперационные системы :Три простых элементаи не забывайте, что execveпрактически всегда является системным вызовом(в Linux, они перечислены в системные вызовы (2 ), см. также введение (2 )), которые повторно инициализируют виртуальное адресное пространство(и некоторые другие вещи )процесса делаю это.

1
05.02.2020, 20:16
4 ответа

Вы можете использовать цикл while -, который зацикливается навсегда, и breakцикл, если файл не найден. Вам нужно переместить команду findвнутрь цикла для повторных проверок:

#!/bin/bash

while true; do
    logfile=$(find /home -maxdepth 1 -type f -mmin -1 -name 'test.log')

    if [ -z "$logfile" ]; then
      break # no file found, break while-loop
    fi
    echo "Now sleeping for 20 seconds"
    sleep 20
done
echo "Job is finished"
2
28.07.2021, 12:04
FILE=$(find. -maxdepth 1 -type f -mmin -1 -name 'test.log' | wc -l)

Подстановка команд расширяется и findзапускается прямо здесь, когда выполняется назначение. Вы не меняете FILEбольше нигде, поэтому он сохранит значение, полученное в начале скрипта. Переместите подстановку и присваивание команд внутрь цикла.

0
28.07.2021, 12:04

Вы не изменяете переменную FILEвнутри цикла (, поэтому она остается неизменной ), и поэтому либо завершается немедленно, либо входит в бесконечный цикл.

Если в вашей системе Linux есть команда stat, попробуйте

while (( ( $(printf "%(%s)T") - $(stat -c"%Y" test.log) ) < 60 ))
  do    echo "Now sleeping for 20 seconds"
        sleep 20
  done

Он использует функции bash%()Tи ((...))и формат эпохи statдля простого вычитания двух значений времени. Если файл изменяется в течение минуты, он продолжает повторяться, пока файл не станет старше одной минуты.

3
28.07.2021, 12:04

Небольшая перегонка раствора @Freddy:

#!/bin/bash

while find /home -maxdepth 1 -type f -mmin -1 -name 'test.log' | grep -q.
do
    echo "Now sleeping for 20 seconds"
    sleep 20
done
echo "Job is finished"

В этом решении используется переключатель grep's -qдля подавления обычного вывода команды grep, который просто проверяет вывод findна пустое/не пустое состояние. Цикл whileбудет продолжаться до тех пор, пока команда findвыводит хотя бы одну строку текста. Как только файл test.logстарше одной минуты, findбольше не производит никакого вывода, и команда grepзавершается с ошибкой, что приводит к прекращению цикла.

0
28.07.2021, 12:04

Теги

Похожие вопросы