Выполнять сценарий, только если условие выполнено - PullRequest
1 голос
/ 11 февраля 2020

У меня есть следующий сценарий

./students.sh |awk '{print $1,$4}'
CLARA
MARC [Found]
STEVE [Found]
GREG [FOUND]
JAKE
#IF FOUND PEFORM ->
./students.sh -move  

И мне нужно создать условие, в котором флаг -move будет применяться только в условии, когда MAR C STEVE AND GREG будет иметь статус FOUND, в другом случае просто не делай ничего.

1 Ответ

1 голос
/ 11 февраля 2020

Один из способов выполнить задачу такого типа c заключается в том, чтобы использовать код завершения предыдущей программы, чтобы определить, следует ли выполнять следующую программу.

В общем случае:

if anycommand; then
    anothercommand 
fi

anothercommand будет выполняться только в том случае, если anycommand был успешным, как определено кодом выхода для любой команды.

awk может выйти с ненулевым статусом, если вы этого хотите. В качестве простого примера:

/MARC/ {
    # Successful exit immediately if MARC is found
    exit 0
}
/CRAM/ {
    # Failure exit immediately if CRAM is found
    exit 1
}

Тогда ваша задача становится записать код awk в exit 0, если найдены MAR C STEVE и GREG, и exit 1 в противном случае. 0 - код выхода по умолчанию, поэтому убедитесь, что вы явно exit 1, если они не все присутствуют.

if ./students.sh | awk 'your code here'; then
    ./students.sh -move  
fi

Вы также можете "замкнуть" это. Два амперсанда говорят оболочке выполнять ./students -move, только если предыдущая команда вышла со статусом 0.

./students.sh | awk 'your code here' && ./students.sh -move

РЕДАКТИРОВАТЬ: Когда Чарльз Даффи комментирует, вам определенно следует обратить внимание. Пожалуйста, прочитайте пост, на который он ссылался в комментариях. Вот пример того, как вы можете организовать свой код awk. Как написано, он чувствителен к регистру, поэтому «MAR C [FOUND]» не приведет к успеху. Кроме того, якорей здесь нет, поэтому «ARAMAR C [Found]» вызовет успех, а не просто «MAR C [Found]». Вам придется усилить код для обработки этих ситуаций, но, надеюсь, это поможет.

/MARC \[Found\]/ {
    # Set flag to true
    marc = 1
}
/STEVE \[Found\]/ {
    steve = 1
}
/GREG \[Found\]/ {
    greg = 1
}
END {
    if (marc && steve && greg) {
        # Successful exit if all 3 are found
        exit 0
    }
    # Failure exit otherwise
    exit 1
}

EDIT 2 : Возможно, вы заметили, что вышеупомянутое решение не очень хорошо масштабируется , Для проверки трех студентов это не плохо. Но если вы хотите проверить, что 10 000 учеников «найдены», решение несостоятельно. Если вы ищете решение, которое хорошо масштабируется, я бы хотел создать отсортированный файл с именем «required.dat», содержащий студентов, которых нужно найти. Запустив скрипт ./students.sh, направьте его на awk '$4 ~ /\[Found\]/ {print $1}' | sort > found.dat. Это создаст другой файл со студентами, которые будут найдены. Затем введите N_REQ_NOT_FOUND=$(comm -23 required.dat found.dat | wc -l), чтобы найти количество студентов, которые были необходимы, но не найдены. Если $ N_REQ_NOT_FOUND больше 0, это означает, что некоторые учащиеся были обязательны, но не найдены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...