Як передати аргументи в сценарій 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 змінні.