Як працювати зі змінними в Bash

Змінні є життєво важливими, якщо ви хочете писати сценарії та зрозуміти, що робитиме код, який ви збираєтеся вирізати та вставляти з Інтернету, на ваш комп’ютер Linux. Ми розпочнемо вас!

Змінні 101

Змінні — це іменовані символи, які представляють рядкове або числове значення. Коли ви використовуєте їх у командах і виразах, вони обробляються так, ніби ви ввели значення, яке вони містять, замість імені змінної.

Щоб створити змінну, ви просто вкажіть для неї назву та значення. Назви змінних мають бути описовими та нагадувати про значення, яке вони мають. Ім’я змінної не може починатися з числа, а також не може містити пробіли. Однак можна почати з підкреслення. Крім того, ви можете використовувати будь-яку комбінацію великих і малих буквено-цифрових символів.

Приклади

Тут ми створимо п’ять змінних. Формат полягає у введенні імені, знаку рівності = та значення. Зверніть увагу, що перед або після знаку рівності немає пробілу. Надання значення змінній часто називають присвоєнням значення змінній.

Ми створимо чотири рядкові змінні та одну числову змінну, this_year:

me=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019

До дивіться значення у змінній, скористайтеся командою echo. Ви повинні перед назві змінної поставити знак долара $, коли ви посилаєтеся на значення, яке воно містить, як показано нижче:

echo $my_name
echo $my_boost
echo $this_year

The

Давайте використаємо всі наші змінні відразу:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

The

Значення змінних замінюють їх імена. Ви також можете змінити значення змінних. Щоб призначити нове значення змінній my_boost, ви просто повторюєте те, що ви робили, коли призначали її перше значення, наприклад:

my_boost=Tequila

The

Якщо ви повторно запустите попередню команду, тепер ви отримаєте інший результат:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

Відлуння

Таким чином, ви можете використовувати ту саму команду, яка посилається на ті самі змінні, і отримати різні результати, якщо змінити значення, що містяться в змінних.

Про цитування змінних ми поговоримо пізніше. Наразі варто пам’ятати кілька речей:

Змінна в одинарних лапках ‘ розглядається як рядок літералу, а не як змінна.
Змінні в лапках ” розглядаються як змінні.
Щоб отримати значення, що зберігається у змінній, ви повинні вказати знак долара $.
Змінна без знака долара $ містить лише назву змінної.

Ви також можете створити змінну, яка бере своє значення з існуючої змінної або кількості змінних. Наступна команда визначає нову змінну під назвою drink_of_the_Year і призначає їй комбіновані значення змінних my_boost і this_year:

drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year

Напій року=

Як використовувати змінні в скриптах

Без змінних сценарії були б повністю обмежені. Змінні забезпечують гнучкість, яка робить сценарій загальним, а не конкретним рішенням. Щоб проілюструвати різницю, ось сценарій, який підраховує файли в каталозі /dev.

  Як синхронізувати дані про фітнес із Samsung Health та Google Fit

Введіть це у текстовий файл, а потім збережіть його як fcnt.sh (для “кількості файлів”):

#!/bin/bash

folder_to_count=/dev

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Перш ніж ви зможете запустити скрипт, ви повинні зробити його виконуваним, як показано нижче:

chmod +x fcnt.sh

Введіть наступне, щоб запустити сценарій:

./fcnt.sh

Це друкує кількість файлів у каталозі /dev. Ось як це працює:

Визначено змінну під назвою folder_to_count, і вона налаштована на утримання рядка «/dev».
Визначено іншу змінну, яку називають file_count. Ця змінна отримує своє значення з командної заміни. Це командна фраза між дужками $( ). Зверніть увагу, що перед першою дужкою стоїть знак долара $. Ця конструкція $( ) оцінює команди в дужках, а потім повертає їх остаточне значення. У цьому прикладі це значення присвоюється змінній file_count. Що стосується змінної file_count, то їй передається значення для збереження; це не стосується того, як було отримано значення.
Команда, оцінена під час заміни команди, виконує перелік файлів ls у каталозі у змінній folder_to_count, для якої встановлено значення «/dev». Отже, скрипт виконує команду «ls /dev».
Вихід цієї команди передається в команду wc. Параметр -l (кількість рядків) змушує wc порахувати кількість рядків у виводі команди ls. Оскільки кожен файл зазначено в окремому рядку, це кількість файлів і підкаталогів у каталозі “/dev”. Це значення присвоюється змінній file_count.
Останній рядок використовує echo для виведення результату.

Але це працює лише для каталогу «/dev». Як ми можемо змусити скрипт працювати з будь-яким каталогом? Все, що потрібно, це одна маленька зміна.

Як використовувати параметри командного рядка в скриптах

Багато команд, наприклад ls і wc, беруть параметри командного рядка. Вони надають команді інформацію, щоб вона знала, що ви хочете зробити. Якщо ви хочете, щоб ls працював над вашим домашнім каталогом і також показувати приховані файли, ви можете використовувати таку команду, де тильда ~ і параметр -a (all) є параметрами командного рядка:

ls ~ -a

Наші скрипти можуть приймати параметри командного рядка. Вони посилаються як $1 для першого параметра, $2 як другий і так далі, до $9 для дев’ятого параметра. (Насправді, також є $0, але він зарезервований для того, щоб завжди зберігати сценарій.)

Ви можете посилатися на параметри командного рядка в сценарії так само, як і на звичайні змінні. Давайте змінимо наш скрипт, як показано нижче, і збережемо його під новим ім’ям fcnt2.sh:

#!/bin/bash

folder_to_count=$1

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Цього разу змінній folder_to_count присвоюється значення першого параметра командного рядка, $1.

Решта сценарію працює так само, як і раніше. Замість конкретного рішення, ваш сценарій тепер є загальним. Ви можете використовувати його в будь-якому каталозі, оскільки він не запрограмований для роботи лише з «/dev».

  Як відкривати програми, веб-сайти та ярлики з пошуку на iPhone та iPad

Ось як ви можете зробити скрипт виконуваним:

chmod +x fcnt2.sh

Тепер спробуйте з кількома каталогами. Ви можете спочатку зробити «/dev», щоб переконатися, що ви отримаєте той самий результат, що й раніше. Введіть наступне:

./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin

Ви отримаєте той самий результат (207 файлів), що й раніше для каталогу “/dev”. Це обнадійливо, і ви отримуєте результати для кожного з інших параметрів командного рядка для певного каталогу.

Щоб скоротити сценарій, ви можете взагалі відмовитися від змінної folder_to_count і просто посилатися на $1, як показано нижче:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Робота зі спеціальними змінними

Ми згадали $0, який завжди встановлюється на ім’я файлу сценарію. Це дозволяє використовувати сценарій, щоб робити такі речі, як правильно друкувати його назву, навіть якщо його перейменовано. Це корисно в ситуаціях ведення журналу, коли потрібно знати назву процесу, який додав запис.

Нижче наведено інші спеціальні попередньо встановлені змінні:

$#: скільки параметрів командного рядка було передано в сценарій.
[email protected]: Усі параметри командного рядка передаються в сценарій.
$?: статус завершення останнього запущеного процесу.
$$: ідентифікатор процесу (PID) поточного сценарію.
$USER: ім’я користувача, який виконує сценарій.
$HOSTNAME: ім’я хоста комп’ютера, на якому виконується сценарій.
$SECONDS: кількість секунд, протягом яких сценарій працював.
$RANDOM: повертає випадкове число.
$LINENO: Повертає поточний номер рядка сценарію.

Ви хочете побачити їх усіх в одному сценарії, чи не так? Ти можеш! Збережіть наступне як текстовий файл з назвою special.sh:

#!/bin/bash

echo "There were $# command line parameters"
echo "They are: [email protected]"
echo "Parameter 1 is: $1"
echo "The script is called: $0"
# any old process so that we can report on the exit status
pwd
echo "pwd returned $?"
echo "This script has Process ID $$"
echo "The script was started by $USER"
echo "It is running on $HOSTNAME"
sleep 3
echo "It has been running for $SECONDS seconds"
echo "Random number: $RANDOM"
echo "This is line number $LINENO of the script"

Введіть наступне, щоб зробити його виконуваним:

chmod +x special.sh

Тепер ви можете запустити його з купою різних параметрів командного рядка, як показано нижче.

Змінні середовища

Bash використовує змінні середовища для визначення та запису властивостей середовища, яке створює під час запуску. Ця інформація зберігається, до якої Bash може легко отримати доступ, як-от ваше ім’я користувача, локаль, кількість команд, які може утримувати ваш файл історії, ваш редактор за замовчуванням та багато іншого.

Щоб побачити активні змінні середовища у вашому сеансі Bash, скористайтеся цією командою:

env | less

The

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

Як експортувати змінні

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

  NOTEify Робіть нотатки під час телефонних дзвінків та керуйте контактами

Спочатку збережіть наступне з іменем файлу script_one.sh:

#!/bin/bash

first_var=alpha
second_var=bravo

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

export first_var
export second_var

./script_two.sh

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Це створює дві змінні, first_var і second_var, і призначає деякі значення. Він друкує їх у вікні терміналу, експортує змінні та викликає script_two.sh. Коли script_two.sh завершується, і потік процесу повертається до цього сценарію, він знову друкує змінні у вікні терміналу. Тоді ви зможете побачити, чи змінилися вони.

Другий сценарій, який ми будемо використовувати, це script_two.sh. Це сценарій, який викликає script_one.sh. Введіть наступне:

#!/bin/bash

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

# set new values
first_var=charlie
second_var=delta

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

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

Щоб запустити ці сценарії, вам потрібно ввести наступне, щоб зробити їх виконуваними:

chmod +x script_one.sh
chmod +x script_two.sh

А тепер введіть наступне, щоб запустити script_one.sh:

./script_one.sh

Ось що нам повідомляє вихід:

script_one.sh друкує значення змінних, тобто альфа та браво.
script_two.sh друкує значення змінних (альфа і браво), як він їх отримав.
script_two.sh змінює їх на charlie і delta.
script_one.sh друкує значення змінних, які все ще є альфа- та браво.

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

Як подавати змінні в лапки

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

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

Ось приклад:

site_name=How-To Geek

Bash бачить пробіл перед «Geek» як ознаку того, що нова команда запускається. Він повідомляє, що такої команди немає, і залишає лінію. echo показує нам, що змінна site_name нічого не містить — навіть текст «How-To».

Спробуйте зробити це ще раз із лапками навколо значення, як показано нижче:

site_name="How-To Geek"

ім'я_сайту=

Цього разу воно розпізнається як єдине значення та правильно присвоєно змінній site_name.

echo – твій друг

Може знадобитися деякий час, щоб звикнути до заміни команд, цитування змінних і запам’ятовування, коли включати знак долара.

Перш ніж натиснути Enter і виконати рядок команд Bash, спробуйте зробити це з луною перед ним. Таким чином, ви можете бути впевнені, що те, що станеться, те, чого ви хочете. Ви також можете відловити будь-які помилки, які ви могли зробити в синтаксисі.