Як передати аргументи в сценарій Bash

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

Монітор комп’ютера зі сценарієм bash ілюстрований

Lifewire / Ран Чжен

Приклад передачі аргументів у сценарії Bash

Якщо ви розробили сценарій під назвою stats.sh для підрахунку слів у файлі, найкраще передати ім’я файлу як аргумент, щоб той самий сценарій можна було використовувати для всіх файлів, які будуть оброблятися. Наприклад, якщо ім’я файлу, що підлягає обробці список пісень, введіть наступне в командному рядку:

sh stats.sh список пісень

Доступ до аргументів здійснюється всередині сценарію за допомогою змінних $1, $2, $3, і так далі. Змінна $1 посилається на перший аргумент, $2 до другого аргументу, і $3 до третього аргументу. Наприклад, у скрипті:

FILE1=$1
туалет $FILE1

Призначте змінну з описовим ім’ям значенню першого аргументу ($1), а потім викликати утиліту підрахунку слів (туалет) на змінну $FILE1 або що ще ви захочете зробити.

Якщо вам потрібна змінна кількість аргументів, використовуйте $@ змінна, яка є масивом усіх вхідних параметрів. Ця процедура використовує a цикл for ітеративно обробляти кожен з них, як показано в наступному прикладі:

для FILE1 в "$@"
робити
туалет $FILE1
зроблено

Ось приклад того, як викликати цей сценарій з аргументами з командного рядка:

sh stats.sh список пісень1 список пісень2 список пісень3

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

sh stats.sh 'список пісень 1' 'список пісень 2' 'список пісень 3'

Метод прапорів

Часто сценарій пишеться так, щоб аргументи можна було передавати в будь-якому порядку за допомогою прапорів. За допомогою методу flags деякі аргументи можна зробити необов’язковими.

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

makereport -u jsmith -p зошити -d 20-10-2011 -f pdf

Bash вмикає цю функцію за допомогою getopts функція. Для наведеного вище прикладу скористайтеся getopts наступним чином:

а getopts u: d: p: f: option
робити
випадок "${option}"
в
u) USER=${OPTARG};;
г) ДАТА=${OPTARG};;
p) PRODUCT=${OPTARG};;
f) FORMAT=${OPTARG};;
esac
зроблено

Це цикл while, який використовує getopts функція і т. зв optstring-в цьому випадку u: d: p: f:— перебирати аргументи. The поки цикл проходить через рядок opt, який містить прапорці, які використовуються для передачі аргументів, і призначає значення аргументу, надане для цього прапора, змінній варіант. The випадок потім оператор призначає значення змінної варіант до глобальної змінної, яка використовується після прочитання всіх аргументів.

Значення двокрапки

Двокрапки в рядку параметрів означають, що значення потрібні для відповідних прапорів. У наведеному вище прикладі u: d: p: f:, після всіх прапорців ставиться двокрапка. Це означає, що всім прапорам потрібно значення. Якщо, наприклад, d і f не очікувалося, що прапори будуть мати значення, u: dp: f буде рядком opt.

Початкова двокрапка переводить getopts у «режим беззвучного звітування». Замість того, щоб повністю помилятися в сценарії, будь-який неочікуваний аргумент заповнює? опцію, і ви можете шукати або обробляти це за потреби. Без початкового двокрапки в рядку параметрів термінал відображає помилку. Наприклад, у мене є сценарій зверху, який підраховує слова. Він очікує синтаксису, наприклад "stats.sh -f filename". Без двокрапки, якщо я спробую "stats.sh -h", я отримую:

stats.sh -h
stats.sh: незаконний варіант -- h

Тоді як за допомогою двокрапки я можу потім поставити рядок у свій сценарій, очікуючи щось подібне, наприклад - ?) echo "Аргумент -${OPTARG} не знайдено.";;. Тоді це дозволить мені зафіксувати та обробити несподіваний запис (у цьому випадку шляхом виведення власного повідомлення про помилку).

stats.sh -h
Аргумент -h не знайдено.

Аргументи, яким не передує прапорець, ігноруються getopts. Якщо прапори, зазначені в рядку параметрів, не надаються під час виклику сценарію, нічого не відбувається, якщо ви спеціально не обробите цей випадок у своєму коді. Будь-які аргументи, не оброблені getops все ще можна захопити за допомогою звичайного $1, $2, і $3 змінні.