Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SPO_SRS.doc
Скачиваний:
5
Добавлен:
02.05.2019
Размер:
1.06 Mб
Скачать

3.2. Екранування

Розглянемо|розгледимо| детальніше прийоми екранування, використовувані в shell. Як засоби|кошти| екранування використовуються подвійні лапки (" "), одинарні лапки (' ') і бэк-слэш| (\).

З|із| прикладів|зразків| очевидно їх дія:

Можна в одному рядку записувати|занотовувати| декілька привласнень.

x=22 y=33 z=$x

A="$x" B='$x' C=\$x

D="$x + $y + $z" E='$x + $y + $z' F=$x\ +\ $y\ +\ $z

(привласнення G=$x + $y не було б виконано із-за пропусків|прогалин|) Тоді

echo A = $A B = $B C = $C

echo D = $D E = $E F = $F

eval echo evaluated A = $A

eval echo evaluated B = $B

eval echo evaluated C = $C

Видадуть на екран

A = 22 B = $x C = $x

D = 22 + 33 + 22 E = $x + $y + $z F = 22 + 33 + 22

evaluated A = 22

evaluated B = 22

evaluated C = 22

Увага: У трьох останніх випадках використана своєрідна команда "eval" (від evaluate - означивать|), яка в підставленій в неї (як аргумент) команді виконує означивание| змінних (якщо такі є|наявний|). В результаті значення "A" залишається тим самим, оскільки "A" має значення "22". А змінні "B" і "C" мають значення "$x". За рахунок означивания|, яке було виконане командою "eval" - evaluated "B" і "C" дають значення "22".

Ще один приклад|зразок| на "eval".

Хай|нехай|

w=\$v v=\$u u=5

В результаті|унаслідок,внаслідок| виконання команд

echo $w

eval echo $w

eval eval echo $w

на екран буде виведено

$v

$u

5

Приведемо ще приклади|зразки|, пов'язані з екрануванням перекладу|переведення,переказу| рядка. Хай|нехай| змінній "string" привласнено значення "масиву" 2x3:

abc

def

Звернемо увагу, що для уникнення привласнення зайвих пропусків|прогалин| другий рядок масиву початий з першої позиції наступного|слідуючого| рядка:

string="abc

def"

Тоді три варіанти запису змінної в команді "echo"

echo $string

echo '$string'

echo "$string"

дадуть відповідно три різні результати:

abc def

$string

abc

def

а послідовність команд

echo "рядок перший

рядок другий" > f1

echo 'рядок перший

рядок другий' > f2

cat f1 f2

дасть видасть послідовно однакові файли f1 і f2:

рядок перший

рядок другий

рядок перший

рядок другий

Відмітимо|помітимо| також, що бэк-слэш| (\) не тільки|не лише| екранує наступний|слідуючий| за ним символ, що дозволяє використовувати спеціальні символи просто як символи, що представляють|уявляють| самі себе (він може екранувати і сам себе - \), але|та| в командному файлі бэк-слэш| дозволяє об'единять| рядки в одну (екранувати кінець рядка).

Наприклад, приклад командного рядка, що наводився раніше:

cat f1 | grep -h result | sort | cat -b > f2

може бути записаний в командному файлі, скажімо, як

cat f1 | grep -h \

result | sort | cat -b > f2

До речі, ефект продовження командного рядка забезпечує і символ конвейєра. В даному випадку це може дати симпатичніший результат, наприклад:

cat f1 |

grep -h result |

sort |

cat -b > f2

3.3. Маніпуляції з|із| shell-змінними

Не дивлячись на те, що shell-змінні в загальному|спільному| випадку сприймаються як рядки, тобто "35" - це не число, а рядок з|із| двох символів "3" і "5", в раді випадків вони можуть інтерпретуватися інакше, наприклад, як цілі числа.

Різноманітні|всілякі| можливості|спроможності| має команда "expr".

Проілюструємо деякі на прикладах|зразках|:

Виконання командного файлу:

x=7 y=2

a=`expr $x + $y` ; echo a=$a

a=`expr $a + 1` ; echo a=$a

b=`expr $y - $x` ; echo b=$b

c=`expr $x '*' $y` ; echo c=$c

d=`expr $x / $y` ; echo d=$d

e=`expr $x % $y` ; echo e=$e

видасть на екран

a=9

a=10

b=-5

c=14

d=3

e=1

Увага: Операція множення ("*") обов'язково повинна бути заекранована|, оскільки в shell цей значок сприймається, як спецсимвол, що означає, що на це місце може бути підставлена будь-яка послідовність символів. Слід звернути також увагу на обов'язкові пропуски|прогалини|, що відокремлюють|відділяють| змінні і знаки операцій.

З|із| командою "expr" можливі не тільки|не лише| (цілочисельні) арифметичні операції, але і рядкові:

A=`expr 'cocktail' : 'cock'` ; echo $A

B=`expr 'cocktail' : 'tail'` ; echo $B

C=`expr 'cocktail' : 'cook'` ; echo $C

D=`expr 'cock' : 'cocktail'` ; echo $D

На екран будуть виведені числа, що показує число співпадаючих символів в ланцюжках (від початку). Друга з|із| рядків не може бути довше за першу :

4

0

0

0

І нарешті|урешті|, про умовну заміну змінних.

Якщо змінні, скажемо "х", "y", "z", не визначені, то при зверненні до змінних

${x-new}

як значення "x" буде видане "new"

${y=new}

як значення "у" буде привласнене "new"

${z?new}

як значення "z" буде видане "z: new" і

відповідна процедура припиняється.

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

А в наступному|такому| випадку навпаки, хай|нехай| змінна "v" має якесь значення, тоді

${z+new}

як значення "z" буде видане "new", а якщо не було привласнене значення, то порожній|пустий| рядок.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]