Linux Mint    Ubuntu    openSUSE    Asterisk    FreeBSD    Android    Nokia N900    Игры в Linux
 Linux Mint    Ubuntu     openSUSE     Asterisk     FreeBSD     Android     N900     Games

Изучаем Bash: Команда test и ее аналоги. Проверка файлов и сравнение строк

После небольшой паузы, я продолжаю писать статьи на тему Bash и сегодня мы поговорим о команде test и ее аналогах. Разбирать одну теорию мы не будем и давайте сразу взглянем на скрипт и разберемся на его примере.

Скрипт:

#!/bin/bash

file=/etc/fstab     # Объявляем переменную

if test -e $file     # Используем команду test

then

  echo "Файл fstab найден."

else

  echo "Что-то нету такого файла"

fi

Как мы видим, мы использовали знакомые нам операторы if / then, которые я уже описывал ранее.

После оператора if стоит команда test которая и и производит проверку нашего файла, который мы объявили в переменной. Также, команду test мы использовали с опцией "-e", данная опция возвращает значение "true", если файл найден.

В случае "true" запускается оператор then и выводит строку echo, если же файл не найдет, что означает "false", то запускается оператор else и выводит сообщение "Что-то нету такого файла".

Теперь давайте рассмотрим аналоги команды test. Тот же скрипт, только вместо test используем другие команды:

#!/bin/bash

file=/etc/fstab     # Объявляем перменную

if /usr/bin/[ -e $file  ]   # Используем команду "[", также мы закрыли ее правой ], потому bash требует ее наличие

then

  echo "Файл fstab найден."

else

  echo "Что-то нету такого файла"

fi

Использовали вместо команды test, команду "[" с закрытой правой "]". Вообще, старые версии bash не требовали наличие правой закрывающейся ]. Теперь это необходимо, чтобы избежать ошибок.

Я рекомендую вместо [ ] использовать конструкцию [[ ]]:

#!/bin/bash

file=/etc/fstab     # Объявляем перменную

if [[ -e $file  ]]   # Используем конструкцию [[ ]]

then

  echo "Файл fstab найден."

else

  echo "Что-то нету такого файла"

fi

Почему [[ ]] лучше, чем [ ]? Потому что внутри [[ ]] вы можете использовать например такие операторы, как: &&, ||, < и >, в то время как внутри [ ] будут сообщения об ошибках.

Кстати, вы можете использовать [ ] и [[ ]] без if / then / else. Те команды как бы заменяют данные операторы:

var1=5

var2=10

[[ "$var1" -ne "$var2" ]] && echo "$var1 не равно $var2"

Давайте разберем, что мы тут написали.

Итак, мы объявили две переменные var1 и var2 с числовыми значениями. Далее, мы вместо if / then / else использовали [[ ]], "-ne", которая находится между "$var1" и "$var2" означает "не ровно". Оператор && - and (и).

Вот так вот :) Любые вопросы приветствуются! :) С следующих статьях мы рассмотрим операции сравнения чисел и строк.

undertaker аватар

у меня вопрос, а арифметические операции делать можно в [[ ]]?

Linux_man аватар

нет, для этого существует оператор (( )), о котором я напишу обязательно :)

undertaker аватар

спасибо! :=) мне это нужно :=)

BAF аватар

Так. Вы хотите сказать что, пример, конвеер cat file | grep 123 лучше всего помещать в [[ ]] ?

Эксперт - зто человек, который совершил все возможные ошибки в очень узкой специальности.

Linux_man аватар

это у тебя кусок кода или это весь скрипт? В этом случае не надо, потому что у тебя тут нету ни какого сравнения, не тестирования... обычный вывод информации и поиск grep. Мое мнение :)

BAF аватар

Конечно это вырезка из скрипта, придуманная на ходу, но у меня реально есть скрипты с похожими условиями. Условия такие:
[ cat file | grep 123 ] ; then
rm file
fi
продолжение скрипта допустим break

Эксперт - зто человек, который совершил все возможные ошибки в очень узкой специальности.

Linux_man аватар

в твоем случае ты можешь вместо [ ], использовать оператор if, то есть:

if cat file | grep 123; then
rm file
fi

действие будет аналогичным :)

BAF аватар

Едрен батом, прошу прощения. Я не верно написал
[ `cat file | grep 123` = 123 ]
Но ваш способ кажется еще лучше, попробую.

Эксперт - зто человек, который совершил все возможные ошибки в очень узкой специальности.

Linux_man аватар

что значит grep 123 = 123 и зачем тут используешь одинарные ковычки?

P.S. Александр, я настолько простой, что лучше ко мне на "ты" ;)

BAF аватар

Все просто. любую команду имеющую параметры через пробел нужно помещать в `` иначе shell не понимает. А вообще смысл у моего примера такой: если в текстовом файле появится строчка имеющая 123, это для примера, на самом деле в реальном скрипте ищется #####, так вот если это в файле есть, то файл не обрабатывать, а удалить и перейти к следующему циклу. Возможно я забыл еще что-то но смысл такой и он у меня работает. Есть правда у меня косяк: если попадется 2 строчки с тем что я ищю, то скрипт пишет: test argument expected и завершается полность, пока это еще не побарол, не могу понять почему ему 2 значения в поиске не устраивает, благо такое случается раз в пол года.

А я понял!!!! Можно либо в ` ` либо в [[ ]] вот и весь ответ. Блин как обычно не дочитал совсем немного. Спасибо, но я привык ``.

Эксперт - зто человек, который совершил все возможные ошибки в очень узкой специальности.

Linux_man аватар

я имел ввиду, почему два раза у тебя 123 в скрипте? :)

BAF аватар

Как понять зачем, если условие равно то, если нет то, не пойму в чем собственно вопрос.

Эксперт - зто человек, который совершил все возможные ошибки в очень узкой специальности.

skim1776 аватар

отличная работа, Максим, я тоже присоединюсь к написанию статей по bash, хорошая тема

Linux_man аватар

Спасибо, Сергей :) тогда добро пожаловать сюда: https://linuxcenter.kz/bash

тема просто отличная! :)