[Linux] Передача параметров, getopts, getopt в сценарии оболочки


[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

おすすめ

転載: blog.csdn.net/m0_45406092/article/details/133276390