Онлайн робочі станції OnWorks Linux та Windows

логотип

Безкоштовний онлайн-хостинг для робочих станцій

<Попередній | зміст | Наступна>

Комбінування виразів

Також можна комбінувати вирази для створення більш складних оцінок. Вирази об'єднуються за допомогою логічних операторів. Ми побачили їх у розділі 17, коли дізналися про знаходити команда. Є три логічні операції для тест та [[]]. Вони І, АБО і НІ. тест та [[]] використовуйте різні оператори для представлення цих операцій:


Таблиця 27-4: Логічні оператори


операція TESt [[ ]] і (( ))

операція TESt [[ ]] і (( ))

І -a &&


зображення

OR -о ||


зображення

НЕ ! !


зображення


Ось приклад операції І. Наступний сценарій визначає, чи знаходиться ціле число в діапазоні значень:



#! / бін / баш


# test-integer3: визначити, чи знаходиться ціле число в межах a

# вказаний діапазон значень.


MIN_VAL=1 MAX_VAL=100


INT=50

#! / бін / баш


# test-integer3: визначити, чи знаходиться ціле число в межах a

# вказаний діапазон значень.


MIN_VAL=1 MAX_VAL=100


INT=50



якщо [[ "$INT" =~ ^-?[0-9]+$ ]]; тоді

якщо [[ INT -ge MIN_VAL && INT -le MAX_VAL ]]; потім echo "$INT знаходиться в межах від $MIN_VAL до $MAX_VAL."

ще

echo "$INT виходить за межі діапазону."

fi ще

echo "INT не є цілим числом." >&2 вихід 1

fi


якщо [[ "$INT" =~ ^-?[0-9]+$ ]]; тоді

якщо [[ INT -ge MIN_VAL && INT -le MAX_VAL ]]; потім echo "$INT знаходиться в межах від $MIN_VAL до $MAX_VAL."

ще

echo "$INT виходить за межі діапазону."

fi ще

echo "INT не є цілим числом." >&2 вихід 1

fi


У цьому скрипті ми визначаємо, чи має значення ціле число INT лежить між значеннями MIN_VAL та MAX_VAL. Це виконується одноразовим використанням [[]], який містить два вирази, розділені символом && оператор. Ми також могли б закодувати це за допомогою тест:


if [ $INT -ge $MIN_VAL -a $INT -le $MAX_VAL ]; потім echo "$INT знаходиться в межах від $MIN_VAL до $MAX_VAL."

ще

echo "$INT виходить за межі діапазону."

fi

if [ $INT -ge $MIN_VAL -a $INT -le $MAX_VAL ]; потім echo "$INT знаходиться в межах від $MIN_VAL до $MAX_VAL."

ще

echo "$INT виходить за межі діапазону."

fi


Команда ! Оператор заперечення змінює результат виразу. Він повертає true, якщо вираз хибний, і повертає false, якщо вираз істинний. У наступному сценарії ми змінюємо логіку нашого оцінювання, щоб знайти значення INT які виходять за межі вказаного діапазону:



#! / бін / баш


# test-integer4: визначити, чи знаходиться ціле число за межами a

# вказаний діапазон значень.


MIN_VAL=1 MAX_VAL=100


INT=50


якщо [[ "$INT" =~ ^-?[0-9]+$ ]]; тоді

якщо [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL) ]]; потім echo "$INT знаходиться за межами від $MIN_VAL до $MAX_VAL."

ще

echo "$INT знаходиться в діапазоні."

#! / бін / баш


# test-integer4: визначити, чи знаходиться ціле число за межами a

# вказаний діапазон значень.


MIN_VAL=1 MAX_VAL=100


INT=50


якщо [[ "$INT" =~ ^-?[0-9]+$ ]]; тоді

якщо [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL) ]]; потім echo "$INT знаходиться за межами від $MIN_VAL до $MAX_VAL."

ще

echo "$INT знаходиться в діапазоні."



echo "INT не є цілим числом." >&2 вихід 1

fi


echo "INT не є цілим числом." >&2 вихід 1

fi

Ми також включаємо дужки навколо виразу для групування. Якби вони не були включені, заперечення застосовувалося б лише до першого виразу, а не до комбінації двох. Кодування цього за допомогою тест буде зроблено таким чином:


якщо [ ! \( $INT -ge $MIN_VAL -a $INT -le $MAX_VAL \) ]; потім echo "$INT знаходиться за межами від $MIN_VAL до $MAX_VAL."

ще

echo "$INT знаходиться в діапазоні."

fi

якщо [ ! \( $INT -ge $MIN_VAL -a $INT -le $MAX_VAL \) ]; потім echo "$INT знаходиться за межами від $MIN_VAL до $MAX_VAL."

ще

echo "$INT знаходиться в діапазоні."

fi


Оскільки всі вирази та оператори, які використовуються тест оболонка розглядає як аргументи команди (на відміну від [[]] та (( )) ), символи, які мають особливе значення бити, Такі, як <, >, ( та ), потрібно вводити в лапки або екранувати.

зображення

Бачачи що тест та [[]] робити приблизно те ж саме, що краще? тест є традиційним (і частиною POSIX), тоді як [[]] специфічно для бити. Важливо знати, як користуватися тест, оскільки він дуже широко використовується, але [[]] безсумнівно, корисніший і легший для кодування, тому він є кращим для сучасних сценаріїв.


Портативність – це головоломка маленьких розумів

Якщо ви говорите зі «справжніми» людьми Unix, ви швидко виявите, що багато з них не дуже люблять Linux. Вони вважають це нечистим і нечистим. Один з принципів користувачів Unix полягає в тому, що все має бути «переносним». Це означає, що будь-який сценарій, який ви пишете, повинен мати можливість виконуватися без змін у будь-якій системі, подібній Unix.

Люди Unix мають вагомі підстави вірити в це. Побачивши, що запатентовані розширення до команд і оболонок зробили зі світом Unix до POSIX, вони, природно, насторожено ставляться до впливу Linux на їхню улюблену ОС.

Але портативність має серйозний мінус. Це заважає прогресу. Це вимагає, щоб речі завжди робилися з використанням методів «найменшого спільного знаменника». У випадку програмування оболонки це означає зробити все сумісним з sh, оригінальна оболонка Борна.



зображення

Цей недолік є виправданням, яке виробники власного програмного забезпечення використовують, щоб виправдати свої власні розширення, тільки вони називають їх «інноваціями». Але насправді це лише пристрої для блокування для своїх клієнтів.

Інструменти GNU, такі як бити, не мають таких обмежень. Вони заохочують переносимість, підтримуючи стандарти та будучи загальнодоступними. Ви можете встановити бити та інші інструменти GNU майже в будь-якій системі, навіть у Windows, безкоштовно. Тож сміливо користуйтеся всіма функціями бити. Його насправді портативний


Найпопулярніші хмарні обчислення ОС на OnWorks: