Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Командная строка Linux. ПолноС руководство». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 77

Автор Уильям Шоттс

ВыраТСния для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ†Π΅Π»Ρ‹Ρ… чисСл


Π’ Ρ‚Π°Π±Π». 27.3 пСрСчислСны выраТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ†Π΅Π»Ρ‹Ρ… чисСл.

Π’Π°Π±Π»ΠΈΡ†Π° 27.3. ВыраТСния для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ†Π΅Π»Ρ‹Ρ… чисСл

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

Π˜ΡΡ‚ΠΈΠ½Π½ΠΎ, Ссли...

число1 -eq число2

число1 ΠΈ число2 Ρ€Π°Π²Π½Ρ‹

число1 -ne число2

число1 ΠΈ число2 Π½Π΅ Ρ€Π°Π²Π½Ρ‹

число1 -le число2

число1 мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ числу2

число1 -lt число2

число1 мСньшС, Ρ‡Π΅ΠΌ число2

число1 -ge число2

число1 большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ числу2

число1 -gt число2

число1 большС, Ρ‡Π΅ΠΌ число2


Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ сцСнарий дСмонстрируСт ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅:

#!/bin/bash

# test-integer: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° цСлочислСнного значСния.

INT=-5

if [ -z "$INT" ]; then

echo "INT is empty." >&2

exit 1

fi

if [ $INT -eq 0 ]; then

echo "INT is zero."

else

if [ $INT -lt 0 ]; then

echo "INT is negative."

else

echo "INT is positive."

fi

if [ $((INT % 2)) -eq 0 ]; then

echo "INT is even."

else

echo "INT is odd."

fi

fi

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ сцСнарий опрСдСляСт Ρ‡Π΅Ρ‚Π½ΠΎΡΡ‚ΡŒ (even) ΠΈΠ»ΠΈ Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΡΡ‚ΡŒ (odd) Ρ†Π΅Π»ΠΎΠ³ΠΎ числа. Он Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ остаток ΠΎΡ‚ дСлСния числа Π½Π° 2, ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡƒΠ΄ΠΈΡ‚ΡŒ ΠΎ чСтности ΠΈΠ»ΠΈ нСчСтности числа.

Π‘ΠΎΠ»Π΅Π΅ соврСмСнная вСрсия ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ test


ПослСдниС вСрсии bash Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΡΠΎΡΡ‚Π°Π²Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, которая дСйствуСт ΠΊΠ°ΠΊ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ Π·Π°ΠΌΠ΅Π½Π° для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ test. Она ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:

[[ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ]]

Π³Π΄Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ истинноС (true) ΠΈΠ»ΠΈ Π»ΠΎΠΆΠ½ΠΎΠ΅ (false) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Команда [[ ]] ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ test (ΠΎΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ выраТСния), Π½ΠΎ добавляСт Π½ΠΎΠ²ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ строк:

строка1 =~ рСгулярноС_Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅Π΅ истинноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли строка1 соотвСтствуСт Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΌΡƒ рСгулярному Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΡˆΠΈΡ€ΠΎΠΊΠΈΠ΅ пСрспСктивы для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° коррСктности Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ сцСнарий, Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ†Π΅Π»Ρ‹Ρ… чисСл, ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ с ошибкой, Ссли константС INT ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ любоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ Ρ†Π΅Π»Ρ‹ΠΌ числом. Для надСТности ΡΡ†Π΅Π½Π°Ρ€ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ константа Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ содСрТит Ρ†Π΅Π»ΠΎΠ΅ число. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ [[ ]] с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ строки =~, ΠΌΡ‹ ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΡƒΠ΅ΠΌ Π΅Π³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

#!/bin/bash

# test-integer2: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° цСлочислСнного значСния.

INT=-5

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

if [ $INT -eq 0 ]; then

echo "INT is zero."

else

if [ $INT -lt 0 ]; then

echo "INT is negative."

else

echo "INT is positive."

fi

if [ $((INT % 2)) -eq 0 ]; then

echo "INT is even."

else

echo "INT is odd."

fi

fi

else

echo "INT is not an integer." >&2

exit 1

fi

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΌΡ‹ смогли ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΊΡ€ΡƒΠ³ провСряСмых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² константС INT Ρ‚ΠΎΠ»ΡŒΠΊΠΎ строками, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌΠΈΡΡ с Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΠΊΠ° «минус», Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт ΠΎΠ΄Π½Π° ΠΈΠ»ΠΈ нСсколько Ρ†ΠΈΡ„Ρ€. Π­Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ устраняСт Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ появлСния пустых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ [[ ]]: ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ == ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ сопоставлСниС с шаблоном ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ подстановки ΠΏΡƒΡ‚Π΅ΠΉ. НапримСр:

[ [email protected] ~]$ FILE=foo.bar

[ [email protected] ~]$ if [[ $FILE == foo.* ]]; then

> echo "$FILE matches pattern 'foo.*'"

> fi

foo.bar matches pattern 'foo.*'

Она ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ [[ ]] Π² ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ инструмСнт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΏΡƒΡ‚Π΅ΠΉ.

(( )) β€” для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ†Π΅Π»Ρ‹Ρ… чисСл


Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ составной ΠΊΠΎΠΌΠ°Π½Π΄Π΅ [[ ]] bash ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΡΡ‚Π°Π²Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Β­Π΄Ρƒ (( )), ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами. Она ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΠ΅ мноТСство арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ рассказываСтся Π² Π³Π»Π°Π²Π΅ 34.

Команда (( )) примСняСтся для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ истинности арифмСтичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. АрифмСтичСскоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ считаСтся истинным, Ссли Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ отличаСтся ΠΎΡ‚ нуля.

[ [email protected] ~]$ if ((1)); then echo "It is true."; fi

It is true.

[ [email protected] ~]$ if ((0)); then echo "It is true."; fi

[ [email protected] ~]$

ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² (( )), ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ сцСнарий test-integer2, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Β­Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

#!/bin/bash

# test-integer2a: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° цСлочислСнного значСния.

INT=-5

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

if ((INT == 0)); then

echo "INT is zero."

else

if ((INT < 0)); then

echo "INT is negative."

else

echo "INT is positive."

fi

if (( ((INT % 2)) == 0)); then

echo "INT is even."

else

echo "INT is odd."

fi

fi

else

echo "INT is not an integer." >&2

exit 1

fi

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ здСсь ΠΌΡ‹ использовали Π·Π½Π°ΠΊ «мСньшС», Π° равСнство провСряСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ==. Π’Π°ΠΊΠΎΠΉ синтаксис выглядит Π±ΠΎΠ»Π΅Π΅ СстСствСнным ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами. ΠžΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎ составная ΠΊΠΎΠΌΠ°Π½Π΄Π° (( )) являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ синтаксиса ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ, Π° Π½Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Ρ†Π΅Π»Ρ‹ΠΌ числам, распознаСт ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ подстановку.

ОбъСдинСниС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ


Для Π±ΠΎΠ»Π΅Π΅ слоТных вычислСний сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ объСдинСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ выраТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ логичСских ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². ΠœΡ‹ ΡƒΠΆΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»ΠΈΡΡŒ с Π½ΠΈΠΌΠΈ Π² Π³Π»Π°Π²Π΅ 17, ΠΊΠΎΠ³Π΄Π° ΠΈΠ·ΡƒΡ‡Π°Π»ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ find. ВсСго ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ test ΠΈ [[ ]] ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ‚Ρ€ΠΈ логичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ И (AND), Π˜Π›Π˜ (OR) ΠΈ НЕ (NOT). Для прСдставлСния этих ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ test ΠΈ [[ ]] ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² Ρ‚Π°Π±Π». 27.4.

Π’Π°Π±Π»ΠΈΡ†Π° 27.4. ЛогичСскиС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ

test

[[ ]] ΠΈ (( ))

И

-a

&&

Π˜Π›Π˜

-o

||

НЕ

!

!


НиТС приводится ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ И (AND). Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ сцСнарий опрСдСляСт Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ цСлочислСнного значСния Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½:

#!/bin/bash

# test-integer3: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° вхоТдСния цСлочислСнного значСния

# Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½.

MIN_VAL=1

MAX_VAL=100

INT=50

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

if [[ INT -ge MIN_VAL && INT -le MAX_VAL ]]; then

echo "$INT is within $MIN_VAL to $MAX_VAL."

else

echo "$INT is out of range."

fi

else

echo "INT is not an integer." >&2

exit 1

fi

Π­Ρ‚ΠΎΡ‚ сцСнарий опрСдСляСт, ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π»ΠΈ цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ INT Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΌΠ΅ΠΆΠ΄Ρƒ MIN_VAL ΠΈ MAX_VAL. Π­Ρ‚Π° опСрация выполняСтся СдинствСнной ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ [[ ]], Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ Π΄Π²Π° выраТСния, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ &&. Π’Ρƒ ΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ test:

if [ $INT -ge $MIN_VAL -a $INT -le $MAX_VAL ]; then

echo "$INT is within $MIN_VAL to $MAX_VAL."

else

echo "$INT is out of range."

fi

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ отрицания! ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выраТСния. Он Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ истинноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π»ΠΎΠΆΠ½ΠΎ, ΠΈ Π»ΠΎΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ истинно. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ сцСнарии ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΈΠΊΡƒ вычислСний, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, находится Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ INT Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°:

#!/bin/bash

# test-integer4: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ‹Ρ…ΠΎΠ΄Π° цСлочислСнного значСния

# Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°.

MIN_VAL=1

MAX_VAL=100

INT=50

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then

if [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL) ]]; then

echo "$INT is outside $MIN_VAL to $MAX_VAL."

else

echo "$INT is in range."

fi

else

echo "INT is not an integer." >&2

exit 1

fi

Π—Π΄Π΅ΡΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки для Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΈ. Если этого Π½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ отрицания Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ выраТСния, Π° Π½Π΅ ΠΊ объСдинСнию Π΄Π²ΡƒΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. Π’Ρƒ ΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ test:

if [ ! \( $INT -ge $MIN_VAL -a $INT -le $MAX_VAL \) ]; then

echo "$INT is outside $MIN_VAL to $MAX_VAL."

else

echo "$INT is in range."

fi

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС выраТСния ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ test ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ ΠΊΠ°ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ [[ ]] ΠΈ (( ))), символы, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для bash, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ <, >, ( ΠΈ ), Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ ΠΈΠ»ΠΈ ΡΠΊΡ€Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Учитывая, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ test ΠΈ [[ ]] Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ стСпСни Ρ€Π°Π²Π½ΠΎΡ†Π΅Π½Π½Ρ‹, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос: ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΎΡ‚Π΄Π°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅? Команда test являСтся Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎΠΉ (ΠΈ Ρ‡Π°ΡΡ‚ΡŒΡŽ стандарта POSIX), Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π° [[ ]] Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Π° для bash. Π£ΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ test ΠΊΡ€Π°ΠΉΠ½Π΅ Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° примСняСтся ΠΎΡ‡Π΅Π½ΡŒ ΡˆΠΈΡ€ΠΎΠΊΠΎ, Π½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° [[ ]] ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ Π² использовании.

ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒ β€” бСспочвСнныС страхи ΠΎΡ‚ нСпонимания

Если Π²Π°ΠΌ довСдСтся ΠΏΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ с «истинными» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ Unix, Π²Ρ‹ быстро ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… Linux Ρ‚Π΅Ρ€ΠΏΠ΅Ρ‚ΡŒ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚. Они ΠΎΡ†Π΅Π½ΠΈΠ²Π°ΡŽΡ‚ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π½Π΅Ρ‡Ρ‚ΠΎ нСчистоС ΠΈ Π³Ρ€Π΅Ρ…ΠΎΠ²Π½ΠΎΠ΅. Один ΠΈΠ· ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² Ρ‚Π°ΠΊΠΈΡ… Ρ€Π΅Π²Π½ΠΈΡ‚Π΅Π»Π΅ΠΉ Unix β€” всС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ пСрСносимым. Π’ΠΎ Π΅ΡΡ‚ΡŒ любой сцСнарий, написанный Π²Π°ΠΌΠΈ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² любой Unix-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ систСмС.