Статьи

Операції і суміжні теми

присвоювання variable assignment

Ініціалізація змінної або зміна її значення

=

Універсальний оператор присвоювання, придатний як для порівняння цілих чисел, так і для порівняння рядків.

var = 27 category = minerals # Прогалини до і після оператора "=" - неприпустимі.
var = 27 category = minerals # Прогалини до і після оператора = - неприпустимі

Нехай вас не бентежить, що оператор присвоювання (), за своїм зовнішнім виглядом, збігається з оператором порівняння ( = ).

# Тут знак "=" виступає в якості оператора порівняння if [ "$ string1" = "$ string2"] # if [ "X $ string1" = "X $ string2"] більше відмовостійкий варіант, # оберігає від "звалювання" помилково в разі, коли одна з змінних порожня. # (Додані символи "X" компенсують один одного.) Then command fi

арифметичні оператори

+

складання

-

віднімання

*

множення

/

поділ

**

зведення в ступінь

# У Bash, починаючи з версії 2.02, був введений оператор піднесення до степеня - "**". let "z = 5 ** 3" echo "z = $ z" # z = 125
%

модуль (розподіл по модулю), повертає залишок від ділення

bash $ echo `expr 5% 3` 2

Цей оператор може застосовуватися в алгоритмах генерації псевдовипадкових чисел в заданому діапазоні (див. приклад 9-23 і приклад 9-25 ), Для форматування виводу на екран (див. приклад 25-10 і Приклад A-7 ), І навіть для генерації простих чисел (див. Приклад A-18 ). На подив часто операцію ділення по модулю можна зустріти в різних чисельних алгоритмах.

Приклад 8-1. Найбільший спільний дільник

#! / Bin / bash # gcd.sh: пошук найбільшого загального дільника # за алгоритмом Евкліда # Під "найбільшим спільним дільником" (нод) двох цілих чисел # + розуміється найбільше ціле число, яке ділить обидва подільних без залишку. # Алгоритм Евкліда виконує послідовний розподіл. # У кожному циклі, # + ділене <--- дільник # + дільник <--- залишок # + до тих пір, поки залишок не стане рівним нулю (залишок = 0). # + The gcd = dividend, on the final pass. # # Чудовий опис алгоритму Евкліда можна знайти # на сайті Jim Loy, http://www.jimloy.com/number/euclids.htm. # ------------------------------------------------- ----- # Перевірка вхідних параметрів ARGS = 2 E_BADARGS = 65 if [$ # -ne "$ ARGS"] then echo "Порядок використання:` basename $ 0` первое-число друге-число "exit $ E_BADARGS fi # - -------------------------------------------------- - gcd () {# Початкове присвоювання. dividend = $ 1 # По суті, не має значення divisor = $ 2 # + який з них більше. # Чому? remainder = 1 # Якщо змінні неініціалізованих, # + то робота сценарію буде перервана помилково # + в першому ж циклі. until [ "$ remainder" -eq 0] do let "remainder = $ dividend% $ divisor" dividend = $ divisor # Повторити цикл з новими вихідними даними divisor = $ remainder done # алгоритм Евкліда} # останнім $ dividend і є нод. gcd $ 1 $ 2 echo; echo "НОД чисел $ 1 і $ 2 = $ dividend"; echo # Вправа: # -------- # Вставте додаткову перевірку вхідних аргументів, # + і передбачте завершення роботи сценарію з повідомленням про помилку, якщо # + вхідні аргументи не є цілими числами. exit 0 + =

(Збільшує значення змінної на задане число)

let "var + = 5" значення змінної var буде збільшено на 5.

- =

(Зменшення значення змінної на задане число)

* =

(Помножити значення змінної на задане число, результат записати в змінну)

let "var * = 4" значення змінної var буде збільшено в 4 рази.

/ =

(Зменшення значення змінної в заданий число раз)

% =

(Знайти залишок від ділення значення змінної на задане число, результат записати в змінну)

Арифметичні оператори дуже часто використовуються спільно з командами expr і let .

Приклад 8-2. арифметичні операції

#! / Bin / bash # Від 1 до 6 п'ятьма різними способами. n = 1; echo -n "$ n" let "n = $ n + 1" # let "n = n + 1" теж допустимо echo -n "$ n": $ ((n = $ n + 1)) # оператор ": "обов'язковий, оскільки в іншому випадку, Bash буде # + інтерпретувати вираз" $ ((n = $ n + 1)) "як команду. echo -n "$ n" n = $ (($ n + 1)) echo -n "$ n": $ [n = $ n + 1] # оператор ":" обов'язковий, оскільки в іншому випадку, Bash буде # + інтерпретувати вираз "$ [n = $ n + 1]" як команду. # Не викликає помилки навіть якщо "n" містить рядок. echo -n "$ n" n = $ [$ n + 1] # Не викликає помилки навіть якщо "n" містить рядок. # * Намагайтеся уникати вживання такої конструкції, # + оскільки вона вже давно застаріла і не переносимо. echo -n "$ n"; echo # Спасибі Stephane Chazelas. exit 0 #

Цілі числа в Bash фактично є знаковими довгими цілими (32-біт), з діапазоном змін від -2147483648 до 2147483647. Якщо в результаті будь-якої операції ці межі будуть перевищені, то результат вийде помилковим.

a = 2147483646 echo "a = $ a" # a = 2147483646 let "a + = 1" # Збільшити "a" на 1. echo "a = $ a" # a = 2147483647 let "a + = 1" # збільшити "a" ще раз, з виходом за межі діапазону. echo "a = $ a" # a = -2147483648 # ПОМИЛКА! (Вихід за межі діапазону)
a = 2147483646 echo a = $ a # a = 2147483646 let a + = 1 # Збільшити a на 1

Bash нічого не знає про існування чисел з плаваючою комою. Такі числа, через наявність символу десяткового дробу, він сприймає як рядки.

a = 1.5 let "b = $ a + 1.3" # Помилка. # T2.sh: let: b = 1.5 + 1.3: syntax error in expression (error token is ".5 + 1.3") echo "b = $ b" # b = 1 Для роботи з числами з плаваючою комою в сценаріях можна використовувати утиліту-калькулятор bc .

бітові операції

<<

зрушує на 1 біт вліво (множення на 2)

<< =

let "var << = 2" значення змінної var зсувається вліво на 2 біта (множиться на 4)

>>

зрушення вправо на 1 біт (поділ на 2)

>> =

(Має сенс зворотний << =)

&

по-бітове І (AND)

& = |

по-бітове АБО (OR)

| = ~

по-бітова інверсія

!

Як і бітове заперечення

^

по-бітове виключає Або (XOR)

^ =

логічні операції

&&

логічне І (and)

if [$ condition1] && [$ condition2] # Те ж саме, що: if [$ condition1 -a $ condition2] # Повертає true якщо обидва операнда condition1 і condition2 істинні ... if [[$ condition1 && $ condition2]] # те ж вірно # Зверніть увагу: оператор && не повинен використовуватися всередині [...].
if [$ condition1] && [$ condition2] # Те ж саме, що: if [$ condition1 -a $ condition2] # Повертає true якщо обидва операнда condition1 і condition2 істинні

оператор &&, в залежності від контексту, може так само використовуватися в І-списках для побудови складових команд.

логічне АБО (or)

if [$ condition1] || [$ Condition2] # Те ж саме, що: if [$ condition1 -o $ condition2] # Повертає true якщо хоча б один з операндів правдивий ... if [[$ condition1 || $ Condition2]] # Also works. # Зверніть увагу: оператор || не повинен використовуватися всередині [...].
if [$ condition1] ||  [$ Condition2] # Те ж саме, що: if [$ condition1 -o $ condition2] # Повертає true якщо хоча б один з операндів правдивий

Bash проводить перевірку коду повернення КОЖНОГО з операндів в логічних виразах.

Приклад 8-3. Побудова складних умов, які використовують && і ||

#! / Bin / bash a = 24 b = 47 if [ "$ a" -eq 24] && [ "$ b" -eq 47] then echo "Перша перевірка пройшла успішно." else echo "Перша перевірка не пройшла." fi # ОКА: if [ "$ a" -eq 24 && "$ b" -eq 47] # намагається виконати '[ "$ a" -eq 24' # і зазнає невдачі наткнувшись на ']'. # # If [[$ a -eq 24 && $ b -eq 24]] це правильний варіант # (в рядку 17 оператор "&&" має інший зміст, ніж в рядку 6.) # Спасибі Stephane Chazelas. if [ "$ a" -eq 98] || [ "$ B" -eq 47] then echo "Друга перевірка пройшла успішно." else echo "Друга перевірка не пройшла." fi # Опції -a і -o надають # + альтернативний механізм перевірки умов. # Спасибі Patrick Callahan. if [ "$ a" -eq 24 -a "$ b" -eq 47] then echo "Третя перевірка пройшла успішно." else echo "Третя перевірка не пройшла." fi if [ "$ a" -eq 98 -o "$ b" -eq 47] then echo "Четверта перевірка пройшла успішно." else echo "Четверта перевірка не пройшла." fi a = rhino b = crocodile if [ "$ a" = rhino] && [ "$ b" = crocodile] then echo "П'ята перевірка пройшла успішно." else echo "П'ята перевірка не пройшла." fi exit 0

Оператори && і || можуть використовуватися і в арифметичних обчисленнях.

bash $ echo $ ((1 && 2)) $ ((3 && 0)) $ ((4 || 0)) $ ((0 || 0)) 1 0 1 0

інші операції

,

кома

За допомогою оператора кома можна зв'язати кілька арифметичних в одну послідовність. При розборі таких послідовностей, командний інтерпретатор обчислює всі вирази (які можуть мати побічні ефекти) в послідовності і повертає результат останнього.

let "t1 = ((5 + 3, 7 - 1, 15 - 4))" echo "t1 = $ t1" # t1 = 11 let "t2 = ((a = 9, 15/3))" # Виконується присвоювання "a" = 9, # + а потім обчислюється "t2". echo "t2 = $ t2 a = $ a" # t2 = 5 a = 9

Оператор кома найчастіше знаходить застосування в циклах for . Див. приклад 10-12 .


Спонсори:

Хостинг:



Чому?

Новости


 PHILIP LAURENCE   Pioneer   Антистресс   Аромалампы   Бизнес   Игры   Косметика   Оружие   Панно   Романтика   Спорт   Фен-Шуй   Фен-Шуй Аромалампы   Часы   ЭКСТРИМ   ЭМОЦИИ   Экскурсии   визитницы   подарки для деловых людей   фотоальбомы  
— сайт сделан на студии « Kontora #2 »
E-mail: [email protected]



  • Карта сайта