- •1. Введення
- •2. Прості засоби|кошти| shell
- •2.1. Структура команд
- •2.2. Угрупування команд.
- •2.3. Перенаправлення команд
- •2.4. Генерація імен файлів.
- •2.5. Командні файли.
- •3. Середовище|середа| shell (змінні і параметри)
- •3.2. Екранування
- •3.3. Маніпуляції з|із| shell-змінними
- •3.4. Експорт змінних
- •3.5. Параметри
- •3.6. Підстановки shell-інтерпретатора
- •3.7. Програмне середовище
- •4. Програмні структури
- •4.1. Команда test ("[ ]")
- •4.2. Умовний оператор "if"
- •4.3. Оператор виклику ("case")
- •4.4. Оператор циклу з|із| переліком|перерахуванням| ("for")
- •4.5. Оператор циклу з|із| передумовою ("while")
- •4.6. Оператор циклу з|із| постумовою ("until")
- •4.7. Порожній оператор
- •4.8. Функції в shell
- •4.9. Обробка переривань ("trap")
- •5. Розробка графічного інтерфейсу за допомогою бібліотеки Qt3. Створення в kDevelop базової структури додатку
- •5.1. Словник
- •5.2. Створення|створіння| проекту
- •5.3. Робота з Qt Designer
- •5.4. Розробка інтерфейсу програми
- •5.5. Додавання|добавка| виджетов|
- •5.6. Створення|створіння| проміжків між виджетами|
- •5.7. Сигнали і слоти
- •5.8. Написання коду
- •6. Литература
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", а якщо не було привласнене значення, то порожній|пустий| рядок. |