Як я можу використовувати порівняння файлу grep всередині оператора bash if / else?


138

Коли наш сервер з’являється, нам потрібно перевірити файл, щоб побачити, як налаштований сервер.

Ми хочемо знайти наступний рядок у файлі /etc/aws/hosts.conf:

MYSQL_ROLE=master

Потім ми хочемо перевірити, чи існує цей рядок, і використовувати оператор if / else для запуску одного з двох варіантів залежно від того, існує рядок чи ні.

Що таке синтаксис BASH для оператора if?

if [ ????? ]; then
  #do one thing
else
  #do another thing
fi

Відповіді:


205

З grep --help, але також бачимо, що людина гребіть :

Статус виходу 0, якщо вибрано будь-який рядок, 1 в іншому випадку; якщо виникає помилка і -q не було задано, статус виходу - 2.

if grep --quiet MYSQL_ROLE=master /etc/aws/hosts.conf; then
  echo exists
else
  echo not found
fi

Ви можете скористатися більш конкретним регулярним виразом, наприклад ^MYSQL_ROLE=master$, щоб уникнути цього рядка в коментарях, імен, які просто починаються з "master" тощо.

Це працює тому, що якщо команда if приймає команду і запускає її, і використовує повернене значення цієї команди, щоб вирішити, як діяти, з нульовим значенням true та ненульовим значенням false - те саме, як інші коди повернення інтерпретуються оболонкою, і протилежна такій мові, як C.


> з нульовим значенням істинним і ненульовим значенням хибним - те саме, що і інші зворотні коди інтерпретуються оболонкою, і протилежною мові, як C. Але чому протилежне ....?
— kchoi

Оскільки нуль, як правило, інтерпретується як "відсутність помилки", тоді як все інше означає "деяку помилку". Якщо передбачається, ми хочемо знати, чи успішно виконана команда.
— таймеллер


23

Зауважте, що для PIPEбудь-якої команди чи послідовності команд, тоді:

if PIPE ; then
  # do one thing if PIPE returned with zero status ($?=0)
else 
  # do another thing if PIPE returned with non-zero status ($?!=0), e.g. error
fi 

Для запису, [ expr ]чи є оболонка, побудована † скороченням для test expr.

Оскільки grepповернення зі статусом 0 у разі збігу та ненульовий статус у разі невідповідності, ви можете використовувати:

if grep -lq '^MYSQL_ROLE=master' ; then 
  # do one thing 
else 
  # do another thing
fi 

Зауважте, використання -lякого піклується лише про файл, що має принаймні одне збіг (так що він grepповертається, як тільки знайде одну відповідність, без зайвого продовження розбору вхідного файлу.)

† на деяких платформах [ expr ]не є вбудованим, але фактично виконуваним /bin/[(чия останнім аргументом буде ]), тому [ expr ]повинні містити пробілу навколо квадратних дужок, і чому він повинен слідувати одному зі списку команд роздільників ( ;, &&, ||, |, &, новий рядок)


4
-lзайвий, grepповертається одразу після пошуку будь-якого матчу з-q
— Відновіть Моніку. Будь-ласка,

3

просто використовуйте bash

while read -r line
do
  case "$line" in
    *MYSQL_ROLE=master*)
       echo "do your stuff";;
    *) echo "doesn't exist";;      
  esac
done <"/etc/aws/hosts.conf"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.