Відповіді:
Командна оболонка і будь-які аргументи цієї команди відображаються в вигляді нумерованих змінних оболонки: $0
має значення рядка самої команди, що - щось на зразок script
, ./script
, /home/user/bin/script
або будь-який інший . Будь-які аргументи з'являються як "$1"
, "$2"
, "$3"
і так далі. Кількість аргументів знаходиться в змінній оболонки "$#"
.
Поширені способи боротьби з цим включають команди оболонки getopts
та shift
. getopts
дуже нагадує функцію getopt()
бібліотеки С. shift
переміщує значення $2
до $1
, $3
до $2
тощо; $#
зменшується. Код закінчується переглядом значення "$1"
, виконуючи речі, використовуючи case
…, esac
щоб вирішити дію, а потім зробити a, shift
щоб перейти $1
до наступного аргументу. Це лише коли-небудь доводиться обстежувати $1
, а може бути $#
.
Ви можете отримати доступ до переданих аргументів, $n
де n
знаходиться номер аргументу - 1, 2, 3, ...
. Ви передаєте аргументи так само, як і в будь-якій іншій команді.
$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world
$/shellscriptname.sh argument1 argument2 argument3
Ви також можете передавати вихід одного сценарію оболонки як аргумент іншому сценарію оболонки.
$/shellscriptname.sh "$(secondshellscriptname.sh)"
У скрипті оболонки ви можете отримати аргументи з числами, як $1
для першого аргументу та $2
для другого аргументу тощо.
Форма
$ ./script.sh "$@"
є найбільш зручним для argv
. Розмежувач аргументу - пробіл, але його можна змінити. Не пам’ятайте, як це було без рук. Потім використовуйте
$1, $2, shift, if [ $# -ne 3 ]
для контролю потоку. Я, як правило, не обіймаю геттоптів, якщо case ... esac
заповіту вистачить.
У bash-скрипті я особисто люблю використовувати наступний сценарій для встановлення параметрів:
#!/bin/bash
helpFunction()
{
echo ""
echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
echo -e "\t-a Description of what is parameterA"
echo -e "\t-b Description of what is parameterB"
echo -e "\t-c Description of what is parameterC"
exit 1 # Exit script after printing help
}
while getopts "a:b:c:" opt
do
case "$opt" in
a ) parameterA="$OPTARG" ;;
b ) parameterB="$OPTARG" ;;
c ) parameterC="$OPTARG" ;;
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
esac
done
# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
echo "Some or all of the parameters are empty";
helpFunction
fi
# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"
Завдяки цій структурі ми не покладаємось на порядок параметрів, оскільки ми визначаємо ключову букву для кожного з них. Також довідкова функція буде надрукована весь час, коли параметри визначені неправильно. Це дуже корисно, коли ми маємо багато сценаріїв з різними параметрами для обробки. Він працює наступним чином:
$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -f "Non-existent parameter"
./myscript: illegal option -- f
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
$ ./myscript -a "String A" -c "String C"
Some or all of the parameters are empty
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
./myscript myargument
myargument
стає $1
всередині myscript
.
В сценарії оболонки; вона стає назвою змінної $ 1. Друге слово стає назвою змінної $ 2 тощо.
cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world
Більше, можливо, можна знайти в посібнику з оболонки (sh) на веб-сайті http://heirloom.sourceforge.net/sh/sh.1.html
Якщо ви знайомі з аргументом Python і не заперечуєте закликати python для розбору аргументів bash, використовуйте bash argparse ( https://github.com/mattbryson/bash-arg-parse ),
Дивіться ту саму відповідь тут: https://stackoverflow.com/questions/7069682/how-to-get-arguments-with-flags-in-bash-script/50181287#50181287
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
echo "Your First Argument was $1 & Second Argument was $2" 2> /dev/null
------------------------------------------------------------------------
./scriptname.sh value1 value2
2> /dev/null
, 2) нічого не додає до існуючих відповідей.
getopt()
- надзвичайно усталений стандарт, алеgetopt
виконуваний файл не є однаковим у дистрибутиві / платформі. Я зараз повністю перетворенийgetopts
користувач, оскільки це стандарт POSIX. Він чудово працює і з тимdash
, що є моїм улюбленим оболонком сценарію