Оператори порівняння та вираження Bash


11

Я новачок у програмі bash. Я прочитав два хороших, довгих посібника, але вони створили безлад у моїй голові щодо операторів та ключових слів.

Які частіше і широко використовуються? Я не знаю, коли використовувати, що і чому.

  1. test, [[ ]]Або [ ]навіть(( ))
  2. $((exp)) або $[exp]
  3. -gtабо >, geабо >=т.д.
  4. коли використовувати <та >чи ( )і коли нам доведеться уникати цього і \: \< \(т.д.
  5. ==або =(рядкове порівняння)

Я знаю , що основні відмінності між [і , [[але і іншими питаннями є для мене загадкою.

Заздалегідь спасибі


2
Дуже корисною вікі, яка є актуальною та згадує багато хорошої практики, є вікі Грега . Посібник Bash і поширені запитання про них особливо корисні.

Відповіді:


5
  • testце вбудована оболонка, в якій (очевидно) тестується певна умова. Деякі старші снаряди потребують спеціальної команди. Тож ви також знайдете програму на /usr/bin/test.
  • [це також програма для перевірки на певний стан. Це програмне забезпечення також потребує закриття дужки, і ви можете знайти його за адресою /usr/bin/[.
  • [[…]]є альтернативою testі [. Він був розроблений для Korn shell ( ksh). Але ви також знаходите його у версіях Bash більше 2 та у Z Shell. Подвійні дужки мають деякі чудові функції:
    • Оболонка не розщеплює слова або розширює ім'я файлу.
    • Вам не потрібно цитувати.
    • Замість -a(AND) або -o(OR) ви можете використовувати &&або ||.
    • =Може зробити набагато більше.
  • ((…))еквівалентно let. Так в основному ((expression))те саме, що let "expression". Однак letви можете використовувати більше одного виразу, але подвійні дужки дозволяють лише одне вираження.
  • $((…))(а також $[…]) робить деякий розрахунок. Ви оболонка намагається обчислити вираз всередині дужок і замінює вираз результатом. Так echo $((1+1))веде до echo 2. Отже, ваші снаряди друкують число 2.

Кожен раз , коли ви хочете порівняти два числа , ви повинні використовувати опцію з тиром і дві буквою ( -ge, і -ltт.д.). Якщо ви хочете порівняти рядки, ви повинні використовувати =або !=.

На ваше питання щодо втечі досить важко відповісти. Тому що це залежить від програмного забезпечення, яке ви використовуєте крім оболонки. Так є grepі grep -Eпотрібна різна витікання. Це стосується і інших sed, awkі інших. Тож найкращий варіант - ознайомитись із сторінкою. Через деякий час ви звикаєте і знаєте, коли користуватися втечею.


Дякую. ще одне запитання - тому що можливо порівняння використовувати ((...)) - чи частіше використовувати цю версію: якщо ((2> 1))
АЛЕ

Я би припустив, що if [ 2 -gt 1 ]; …це більш часто, тому що я це частіше бачу в сценаріях оболонок, і наскільки я знаю, це сумісно з POSIX.
qbi

Ще слід пам’ятати, що [вираз] є істинним, якщо вираз оцінюється на / повертає нуль, але ((вираз)) є істинним, якщо вираз оцінюється на / повертає не нульове значення.
Джо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.