Статьи

внутрішні команди

виводить (на stdout) вираз або вміст змінної (див. приклад 4-1 ).

echo Hello echo $ a

Для виведення екранованих символів, echo вимагає наявність ключа -e. Див. приклад 5-2 .

Зазвичай, командв echo виводить в кінці символ перекладу рядка. Придушити висновок це символу можна ключем -n.

Команда echo може використовуватися для передачі інформації по конвеєру іншим командам.

if echo "$ VAR" | grep -q txt # if [[$ VAR = * txt *]] then echo "$ VAR містить підрядок \" txt \ "" fi

Слід запам'ятати, що команда echo `command` видалить всі символи перекладу рядка, які будуть виведені командою command.

Мінлива $ IFS зазвичай містить символ перекладу рядка \ n, як один з варіантів пробільного символу. Bash розіб'є висновок команди command, по пробільним символам, на аргументи і передасть їх команді echo, яка виведе ці аргументи, розділені пробілами.

bash $ ls -l / usr / share / apps / kjezz / sounds -rw-r - r-- 1 root root 1407 Nov 7 2000 reflect.au -rw-r - r-- 1 root root 362 Nov 7 2000 seconds.au bash $ echo `ls -l / usr / share / apps / kjezz / sounds` total 40 -rw-r - r-- 1 root root 716 Nov 7 2000 reflect.au -rw-r - r- - 1 root root 362 Nov 7 2000 seconds.au

Це вбудована команда Bash і має зовнішній аналог / bin / echo.

bash $ type -a echo echo is a shell builtin echo is / bin / echo

printf - команда форматированного виведення, розширений варіант команди echo і обмежений варіант бібліотечної функції printf () в мові C, до того ж синтаксис їх кілька отдічается один від одного.

printf format-string ... parameter ...

Це вбудована команда Bash. Має зовнішній аналог / bin / printf або / usr / bin / printf. За більш детальною інформацією звертайтесь до сторінок довідкового керівництва man 1 printf по системним командам.

Більш ранні версії Bash можуть не підтримувати команду printf.

Приклад 11-1. printf в дії

#! / Bin / bash # printf demo # Від перекладача: # Вважаю своїм обов'язком нагадати, що як роздільник дробової і цілої # частин в дійсних числах, може використовуватися символ "кома" # (в російських локалях), тому даний сценарій може видавати повідомлення # про помилку (у мене так і сталося) при виведенні числа PI. # Тоді спробуйте замінити в визначенні числа PI десяткову точку # на кому - це повинно допомогти. ;-) PI = 3,14159265358979 DecimalConstant = 31373 Message1 = "Вітаю," Message2 = "Землянин." echo printf "Число пі з точністю до 2 знака після коми =% 1.2f" $ PI echo printf "Число пі з точністю до 9 знака після коми =% 1.9f" $ PI # Навіть округлює правильно. printf "\ n" # Переклад рядка, printf "Константа = \ t% d \ n" $ DecimalConstant # вставлено символ табуляції (\ t) printf "% s% s \ n" $ Message1 $ Message2 echo # ===== ===================================== # # Емуляція функції 'sprintf' в мові C. # Запис форматованої рядки в змінну. echo Pi12 = $ (printf "% 1.12f" $ PI) echo "Число пі з точністю до 12 знака після коми = $ Pi12" Msg = `printf"% s% s \ n "$ Message1 $ Message2` echo $ Msg; echo $ Msg exit 0

Одне з корисних застосувань команди printf - форматований вивід повідомлень про помилки

E_BADDIR = 65 var = nonexistent_directory error () {printf "$ @"> & 2 # Форматований висновок аргументів на stderr. echo exit $ E_BADDIR} cd $ var || error $ "Неможливо перейти в каталог% s." "$ Var" # Спасибі SC

значення змінної з пристрою стандартного введення - stdin, в інтерактивному режимі це означає клавіатуру. Ключ -a дає змогу записувати значення в масиви (див. приклад 25-3 ).

Приклад 11-2. Введення значень змінних за допомогою read

#! / Bin / bash echo -n "дитя значення змінної 'var1':" # Ключ -n пригнічує висновок символу перекладу рядка. read var1 # Зверніть увагу - перед ім'ям змінної відсутній символ '$'. echo "var1 = $ var1" echo # Однією командою 'read' можна вводити кілька змінних. echo -n "дитя значення для змінних 'var2' і 'var3' (через пробіл або табуляцію):" read var2 var3 echo "var2 = $ var2 var3 = $ var3" # Якщо було введено значення тільки однієї змінної, то друга залишиться " порожній ". exit 0

Якщо команді read була передано жодної змінної, то введення буде здійснено в змінну $ REPLY .

Приклад 11-3. Приклад використання команди read без вказівки змінної для введення

#! / Bin / bash echo # -------------------------- # # Перший блок коду. echo -n "Введіть значення:" read var echo "\" var \ "=" $ var "" # Тут немає нічого несподіваного. # -------------------------- # echo echo -n "Введіть інше значення:" read # Команда 'read' вживається без вказівки змінної для введення , # + проте ... # + За замовчуванням введення здійснюється в змінну $ REPLY. var = "$ REPLY" echo "\" var \ "=" $ var "" # Ця частина сценарію еквівалентна першого блоку, виділеного вище. echo exit 0

Зазвичай, при введенні в вікні терміналу за допомогою команди "read", символ \ служить для екранування символу перекладу рядка. Ключ -r змушує інтерпретувати символ \ як звичайний символ.

Приклад 11-4. Введення многострочного тексту за допомогою read

#! / Bin / bash echo echo "Введіть рядок, що завершується символом \\, і натисніть ENTER." echo "Потім введіть другий рядок, і знову натисніть ENTER." read var1 # При читанні, символ "\" екранує новий рядок. # Перший рядок \ # другий рядок echo "var1 = $ var1" # var1 = перший рядок другий рядок # Після введення кожного рядка, що завершується символом "\", # ви можете продовжувати введення на іншому рядку. echo; echo echo "Введіть інший рядок, що завершується символом \\, і натисніть ENTER." read -r var2 # Ключ -r змушує команду "read" сприймати "\" # як звичайний символ. # Перший рядок \ echo "var2 = $ var2" # var2 = перший рядок \ # Введення даних припиняється відразу ж після першого натискання на клавішу ENTER. echo exit 0

Команда read має ряд дуже цікавих опцій, які дозволяють виводити підказку - запрошення до введення (prompt), і навіть читати дані не чекаючи натискання на клавішу ENTER.

# Читання даних, не чекаючи натискання на клавішу ENTER. read -s -n1 -p "Натисніть" keypress echo; echo "Була натиснута кнопка" \ "$ keypress \" "." # -S - пригнічує відлуння-висновок, тобто введення з клавіатури не відображається на екрані. # -N N - введення завершується автоматично, відразу ж після введення N-го символу. # -P - задає вигляд рядка підказки - запрошення до вводу (prompt). # Використання цих ключів трохи ускладнюється тим, що вони повинні слідувати в певному порядку.

Ключ -n, крім усього іншого, дозволяє команді read виявляти натискання курсорних і деяких інших службових клавіш.

Приклад 11-5. Виявлення натискання на курсорні клавіші

#! / Bin / bash # arrow-detect.sh: Виявлення натискання на курсорні клавіші, і не тільки ... # Спасибі Sandro Magi за те що показав мені - як. # -------------------------------------------- # Коди клавіш. arrowup = '\ [A' arrowdown = '\ [B' arrowrt = '\ [C' arrowleft = '\ [D' insert = '\ [2' delete = '\ [3' # ------- ------------------------------------- SUCCESS = 0 OTHER = 65 echo -n "Натисніть на клавішу ... "# Може знадобитися натиснути на ENTER, якщо була натиснута клавіша # яка не входить в список вище. read -n3 key # Прочитати 3 символу. echo -n "$ key" | grep "$ arrowup" # Визначення натиснутоюклавіші. if [ "$?" -eq $ SUCCESS] then echo "Натиснуто клавіша \". "exit $ SUCCESS fi echo -n" $ key "| grep" $ arrowdown "if [" $? "-eq $ SUCCESS] then echo" Натиснуто клавіша \ "exit $ SUCCESS fi echo -n "$ key" | grep "$ arrowrt" if [ "$?" -eq $ SUCCESS] then echo "Натиснуто клавіша \" Про \ "." exit $ SUCCESS fi echo -n "$ key" | grep "$ arrowleft" if [ "$?" -eq $ SUCCESS] then echo "Натиснуто клавіша \". " exit $ SUCCESS fi echo -n "$ key" | grep "$ insert" if [ "$?" -eq $ SUCCESS] then echo "Натиснуто клавіша \" Insert \ "." exit $ SUCCESS fi echo -n "$ key" | grep "$ delete" if [ "$?" -eq $ SUCCESS] then echo "Натиснуто клавіша \" Delete \ "." exit $ SUCCESS fi echo "Натиснуто якась інша клавіша." exit $ OTHER # Вправи: # --------- # 1) Спростіть сценарій, замінивши безліч if-ів # + однієї конструкцією 'case'. # 2) Додайте визначення натискань на клавіші "Home", "End", "PgUp" і "PgDn".

Ключ -t дозволяє обмежувати час очікування введення командою read (див. приклад 9-4 ).

Команда read може зчитувати значення для змінних з файлу, перенаправленого на stdin. Якщо файл містить не один рядок, то змінної буде присвоєно тільки перший рядок. Якщо команді read буде передано кілька змінних, то перший рядок файлу буде розбита, по прогалин, на кілька подстрок, кожна з яких буде записана в свою змінну. Будьте уважні!

Приклад 11-6. Читання командою read з файлу через перенаправлення

#! / Bin / bash read var1 <data-file echo "var1 = $ var1" # Перший рядок з "data-file" цілком записується в змінну var1 read var2 var3 <data-file echo "var2 = $ var2 var3 = $ var3 " # Зверніть увагу! # Поведінка команди "read" далеко від очікуваного! # 1) Стався повернення до початку файлу. # 2) Замість того щоб послідовно читати рядки з файлу, # за кількістю змінних, перший рядок файлу була розбита на підрядка, # розділені пробілами, які і були записані в змінні. # 3) В останню змінну була записана вся решта рядка. # 4) Якщо команді "read" буде передано більше число змінних, ніж подстрок # в першому рядку файлу, то останні змінні залишаться "порожніми". echo "------------------------------------------------ "# Ця проблема легко вирішується за допомогою циклу: while read line do echo" $ line "done <data-file # Спасибі Heiner Steven за роз'яснення. echo "------------------------------------------------ "# Розбір рядка, розділеної на поля # Для завдання роздільник полів, використовується змінна $ IFS, echo" Список всіх користувачів: "OIFS = $ IFS; IFS =: # У файлі / etc / passwd, як роздільник полів # використовується символ ":". while read name passwd uid gid fullname ignore do echo "$ name ($ fullname)" done </ etc / passwd # перенаправлення вводу. IFS = $ OIFS # Відновлення попереднього стану змінної $ IFS. # Цю частину коду написав Heiner Steven. # Якщо змінна $ IFS встановлюється всередині циклу, # + то відпадає необхідність збереження її первісного значення # + в тимчасовій змінної. # Спасибі Dim Segebart за роз'яснення. echo "------------------------------------------------ "echo" Список всіх користувачів: "while IFS =: read name passwd uid gid fullname ignore do echo" $ name ($ fullname) "done </ etc / passwd # перенаправлення вводу. echo echo "Значення змінної \ $ IFS залишилося колишнім: $ IFS" exit 0If [ "$?
Quot;exit $ SUCCESS fi echo -n" $ key "| grep" $ arrowdown "if [" $?

Новости