Каталог статей
[Linux] дополнительные параметры getopts_Советы Bash: введение в использование параметров анализа встроенной команды getopts
1 Обзор
Параметры, передаваемые в сценарий оболочки из командной строки, также называются позиционными параметрами, поскольку сценарий оболочки получает их значения в зависимости от положения параметров. В сценарии оболочки пользователи могут получать параметры через ряд системных переменных.Имена этих системных переменных фиксированы и просты. Как указано в таблице ниже:
имя переменной | иллюстрировать |
$н | Представляет n-й параметр, переданный в сценарий, например, $1 представляет первый переданный параметр, $2 представляет второй параметр и т. д. |
$# | Количество переданных параметров |
$0 | Текущее имя сценария |
$* | Вернуть значения всех параметров в виде «Параметр 1 Параметр 2…» |
$@ | Вернуть значения всех параметров в виде «Параметр 1», «Параметр 2»... |
$_ | последний параметр |
Уведомление:
- Строка, заключенная в одинарные или двойные кавычки, передается как параметр, при передаче кавычки удаляются.
- Параметры, содержащие пробелы или другие специальные символы, необходимо передавать в одинарных или двойных кавычках, чтобы избежать неправильного анализа. Если в параметрах есть пробелы или другие специальные символы, вы не можете использовать * для получения всех параметров. Вместо этого используйте * для получения всех параметров. Вместо этого используйте∗, чтобы получить все параметры, но используйте @.
- $#Количество возвращаемых параметров, исключая $0.
- Если пользователь передает более 9 параметров, $10 нельзя использовать для представления 10-го параметра. Чтобы получить 10-й параметр, пользователь сначала обрабатывает или сохраняет $1, затем с помощью команды Shift удаляет параметр 1 и сдвигает все оставшиеся параметры вниз на 1. В это время 10-й параметр становится равным 9 и так далее . 9 и так далее.9 и так далее. Значение # будет обновлено, чтобы отразить оставшееся количество параметров. Это упрощает перебор кода.
Напишите следующий скрипт:
#!/bin/bash
echo "$# paramters num"
echo "$@"
echo "$*"
echo $@
echo $*
echo $_
Выполните следующую команду и результаты:
eden_ubuntu@edenubuntu:~/Documents/Shell$ ./1-3.sh a "b c" d 111
4 paramters num
a b c d 111
a b c d 111
a b c d 111
a b c d 111
111
2. Расширение параметров
Для простых случаев вышеуказанных системных переменных также достаточно. Но на практике пользователи не всегда сталкиваются с такой простой ситуацией. Например, для команды ls, которую мы часто используем, мы можем ввести
ls -l
ls -la
ls -lrt
Ожидание различных параметров для выполнения разных операций, простое использование $1, $2... больше не может соответствовать требованиям. На данный момент нам нужно использовать расширение параметров. Команда getopts используется в программе Shell. Далее мы поговорим о том, как его использовать подробно.
2.1 получение опций
Примечание. getopts — это встроенная команда bash. Для встроенных команд bash вы не можете использовать команду man для просмотра справочных инструкций.
Дляhelp
просмотра используйте команду. помогите получить
getopts — это команда, поддерживаемая bash. Основной синтаксис getopts следующий:
getopts optstring [arg]
optstring — это строка, содержащая список имен опций, распознаваемых командой getopts. Мы представим символ, синтаксис которого следующий:
Содержание опции | иллюстрировать |
: | Если optsring начинается с:, это указывает на тихий режим и игнорирует общие сообщения об ошибках. |
с | Допустимые параметры, за которыми не следуют значения параметров. |
с : | Допустимые параметры, за которыми должны следовать значения параметров. |
getopts по очереди просматривает каждый параметр и сохраняет имя параметра в arg, а OPTARG сохраняет значение параметра для параметра.
Проиллюстрируем примером:
#!/bin/bash
#input paramters index
echo "OPTIND starts at $OPTIND"
#get paramters
while getopts ":pq:x::" optname # while在迭代时,系统语法会检查当前项是否合法
do #当前项合法后,才会进入do 语句
case "$optname" in
"p") #p
echo "Option $optname is specified"
;;
"q") #q
echo "Option $optname has value $OPTARG"
;;
"?") #
echo "Unknown option $OPTARG"
;;
":")
echo "No argument value for option $OPTARG"
;;
*) #出现上述枚举项之外的项,会进入该分支
# Should not occur
echo "Unknown error while processing options"
;;
esac
echo "OPTION is now $OPTIND"
done
":pq:" означает:
-
getopts игнорирует сообщения об ошибках; за -p не следуют параметры, за -q следуют параметры
-
OPTIND — это системная переменная, указывающая позицию нижнего индекса текущего параметра запроса getopts.
Выполните следующие команды и результаты:
eden_ubuntu@edenubuntu:~/Documents/Shell$ ./1-4.sh -p -q 12
OPTIND starts at 1
Option p is specified
OPTION is now 2
Option q has value 12
OPTION is now 4
Обратите внимание, что следующие команды также могут иметь тот же эффект:
eden_ubuntu@edenubuntu:~/Documents/Shell$ ./1-4.sh -pq 12
OPTIND starts at 1
Option p is specified
OPTION is now 1
Option q has value 12
OPTION is now 3
Это показывает, что и -p -q 12, и -pq 12 могут достичь нашей цели. Таким образом, параметры можно использовать вместе, как обычно используемая нами команда ls: ls -lrt имеет тот же эффект, что и ls -l -r -t.
А что, если нам нужна возможность поддержки широкого формата, например, при использовании cmake:
cmake -DCMAKE_TOOLCHAIN_FILE=arm-toolchain.cmake .
Этот тип getopts не поддерживается! ! ! Нам нужно использовать другую команду getopt
2.2 возглавил
В отличие от getopts, которая является встроенной командой bash, getopt — это внешняя команда, которая обычно включается в дистрибутивы Linux.
Мы можем увидеть разницу, используя команду type
eden_ubuntu@edenubuntu:~/Documents/Shell$ type getopts
getopts is a shell builtin
eden_ubuntu@edenubuntu:~/Documents/Shell$ type getopt
getopt is hashed (/usr/bin/getopt)
Три способа использования getopt :
# 第一种:无法处理带有空格的参数
getopt optstring parameters
# 第二种:可以处理带有空格的参数,但是需要结合eval使用
getopt [options] [--] optstring parameters
# 第三种:结合eval既可以处理带有空格的参数,也可以定义长选项(一个字母为短选项,一个字母以上是长选项)
getopt [options] -o|--options optstring [options] [--] parameters
- options: определения параметров, поставляемые с getopt.
- optstring: параметры настраиваемых опций, например,
за опцией -a -b может следовать двоеточие (:), два двоеточия или отсутствие двоеточия. - параметры: параметры, то есть значения параметров, могут быть пустыми.
Разница между одним двоеточием (:), двумя двоеточиями и отсутствием двоеточия после параметра
- Без двоеточия (:): при выполнении есть только параметры и нет параметров.
- Двоеточие (:): должно выполняться с параметрами (обязательно).
- Два двоеточия (:): при желании можно выполнить с параметрами или без них (необязательно).
getopt поддерживает короткие и длинные параметры, за -o
которыми --option
следуют короткие -l
или --long
длинные параметры:
- Краткий формат опции: -a -b, то есть буква длиной 1.
- Длинный формат опции: -имя, то есть несколько букв.
- Если параметр является обязательным, значение параметра короткой опции может быть пробелом или за ним может следовать опция -c arg или -carg; значение параметра длинной опции может быть пробелом или может быть = соединение, -clong arg или clong=arg
- Если параметр является необязательным, значение параметра короткой опции может быть только близким к опции -carg; значение параметра длинной опции может быть только = конкатенация, -clong=arg
#!/bin/bash
echo original parameters=[$@]
#-o或--options选项后面是可接受的短选项,如ab:c::,表示可接受的短选项为-a -b -c,
#其中-a选项不接参数,-b选项后必须接参数,-c选项的参数为可选的
#-l或--long选项后面是可接受的长选项,用逗号分开,冒号的意义同短选项。
#-n选项后接选项解析错误时提示的脚本名字
ARGS=`getopt -o ab:c:: --long along,blong:,clong:: -n "$0" -- "$@"`
if [ $? != 0 ]; then
echo "Terminating..."
exit 1
fi
echo ARGS=[$ARGS]
#将规范化后的命令行参数分配至位置参数($1,$2,...)
eval set -- "${ARGS}"
echo formatted parameters=[$@]
while true
do
case "$1" in
-a|--along)
echo "Option a";
shift
;;
-b|--blong)
echo "Option b, value=$2";
shift 2
;;
-c|--clong)
case "$2" in
"")
echo "Option c, no value";
shift 1
;;
*)
echo "Option c, value=$2";
shift 2;
;;
esac
;;
--)
shift
echo "shift"
break
;;
*)
echo "Internal error!"
exit 1
;;
esac
done
Команда выполнения и результаты:
eden_ubuntu@edenubuntu:~/Documents/Shell$ ./1-5.sh -a -b 1 --clong=2
original parameters=[-a -b 1 --clong=2]
ARGS=[ -a -b '1' --clong '2' -- ] //clong参数后面的值为 ‘2’
formatted parameters=[-a -b 1 --clong 2 -- ]
Option a
Option b, value=1
Option c, value=2
shift
Если --clong=2
изменить на -clong 2, результаты будут следующими:
eden_ubuntu@edenubuntu:~/Documents/Shell$ ./1-5.sh -a -b 1 --clong 2
original parameters=[-a -b 1 --clong 2 ]
ARGS=[ -a -b '1' --clong '' -- '2' 'test1' 'test2'] //clong参数后面的值为 ‘’
formatted parameters=[-a -b 1 --clong -- 2 ]
Option a
Option b, value=1
Option c, no value
shift
ссылка
Обучение системе оболочки: передача параметров в сценарии оболочки
Подробное объяснение команды Linux-getopt