Як я можу використовувати порівняння файлу 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.