Ответы:
Командная оболочка и любые аргументы этой команды отображаются в виде нумерованных переменных оболочки: $0
имеет строковое значение самой команды, что - то вроде script
, ./script
, /home/user/bin/script
или любой другой . Любые аргументы появляются как "$1"
, "$2"
, "$3"
и так далее. Количество аргументов находится в переменной оболочки "$#"
.
Обычные способы борьбы с этим включают команды оболочки getopts
и shift
. getopts
очень похоже на getopt()
функцию библиотеки C. shift
перемещает значение $2
в $1
, $3
в $2
и т. д .; $#
уменьшается Код заканчивает тем, что смотрит на значение "$1"
, делает что-то, используя case
…, esac
чтобы принять решение о действии, а затем делает, 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 ]
контролировать поток. Я обычно не принимаю getopts, если 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
В сценарии оболочки; это становится именем переменной $ 1. Второе слово становится именем переменной $ 2 и так далее.
cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world
Более подробную информацию можно найти в руководстве по shell (sh) по адресу http://heirloom.sourceforge.net/sh/sh.1.html.
Если вы знакомы с Python argparse и не против вызвать 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
моей предпочитаемой скриптовой оболочкой