Функции для проверки параметров командной строки


Я знаю, что команде getopts доступен, но я хотел написать свою собственную как способ улучшения своих Баш. Ниже я покажу два определения функций и примеры их использования в bash-скрипт. Наконец, я показываю выход из сценария.

Пожалуйста, прокомментируйте.

#!/bin/bash
# Produce a string variable which can be used by function isoption
# to give calling scripts an easy way to determine what options are
# are provided in its command line regardless of their order.  
# Call this function as:
#
#   mygetopts "$@"
#
# Non-option arguments in the command line of the caller are
# passed back to the caller in array NONOPTARGS and can be used like this:
#
#   name=NONOPTARGS[0]
#
# NOTE: Option globbing is not allowed

function mygetopts ()
{ 
# Initialize a string variable which will be made to contain all
# option names in "$@".  Since this string will be used by function
# isoption a weird variable name is used to avoid collision with
# variable names in calling script since it cannot be made local.

    O1P2T3I4O5N6="-"    # O1P2T3I4O5N6 is avaiable to caller
    declare -i i=0      # i is local to function

    if [[ "$1" == "-h" || "$1" == "--help" ]]; then
        echo "Usage: $0 \"\$@\"" >&2
        return 1
    fi

    for arg in "$@" ; do    # arg will be each positional parameter
        if [[ ${arg:0:1} == - ]]    # if $arg begins with -
            # Pack all option names separated by -
            then O1P2T3I4O5N6=${O1P2T3I4O5N6}${arg:1}-

            else NONOPTARGS[i++]=$arg
        fi
        #echo "O1P2T3I4O5N6  =$O1P2T3I4O5N6"
        #echo "NONOPTARGS = ${NONOPTARGS[@]}"
    done
    return 0
}

function isoption ()
{

    if [[ $O1P2T3I4O5N6 =~ ^.*-${1}-.*$ ]] 
        then return 0
        else return 1 
    fi
}
#!/bin/bash
# Example of using functions mygetopts and isoption to provide easy
# access to all command line options as well as non-option arguments
# regardless of their order.
#
# To use these functions place the file MYFUNCTIONS in your $HOME 
# directory and source it in your bash script before using the 
# functions.  Alternately it can be sourced by your .bash_profile

set +vx         # Change + to - to enable tracing
echo
echo These $# command line arguments are provided: 
echo "$@"

. ~/MYFUNCTIONS # source the function definitions
echo
echo These functions are defined:
compgen -A function # Show what functions are defined
echo
mygetopts "$@"  # Call mygetopts with all command line arguments

echo mygetopts returns this string with all options separated by -
echo O1P2T3I4O5N6 = $O1P2T3I4O5N6   # Show the string of all options

echo Examples of the use of isoption function:
if isoption f; then echo f found ; else echo f Not found; fi
if isoption z; then echo z found ; else echo z Not found; fi
if isoption abcd; then echo abcd found ; else echo abcd Not found; fi
if isoption abcde; then echo abcde found ; else echo abcde Not found; fi
echo
echo Examples of the accessing of non-option arguments:
inputfilename=${NONOPTARGS[0]}
outputfilename=${NONOPTARGS[1]}
echo inputfilename=$inputfilename 
echo outputfilename=$outputfilename
***13:00:47 617 ~/work>testmygetopts -bde -f infile -abcd -x outfile -y

Эти 7 аргументов командной строки предназначены:

-бдэ -Ф входной_файл -АВСD -х выходной_файл -г

Эти функции определяются:

  • isoption
  • mygetopts

mygetopts возвращает эту строку, в которой все функции разделены -

O1P2T3I4O5N6 = -bde-f-abcd-x-y-

Примеры использования функции isoption:

f found
z Not found
abcd found
abcde Not found

Примеры доступа аргументами:

inputfilename=infile
outputfilename=outfile


1132
3
задан 5 июня 2011 в 11:06 Источник Поделиться
Комментарии
2 ответа

Код в bash все выглядит довольно хорошо для меня.

-H и --выход помочь не так (он будет печатать фактические параметры, передаваемые, но должна вывести список допустимых параметров/параметров?)

Варианты, как-это-будет-ломаться не будет работать-будет или-перерыв.

Мне вот не понятно, если параметры, содержащие пробелы, будет работать, как в: testmygetopts "это один аргумент"

Я думаю, что 'isoption может быть упрощенных для того, чтобы быть [[ ]] выражение (поскольку он будет возвращать 0 или 1 уже).

3
ответ дан 27 сентября 2011 в 09:09 Источник Поделиться

...

declare -i i=0      # i is local to function

Внутри функции объявить и местные делают то же самое, но если вы собираетесь писать код, комментарий говорит, что это местные, не думаю, что местные сайта более самодокументированный? Я мог бы написать это...

local -i i=0

if [[ "$1" == "-h" || "$1" == "--help" ]]; then

...

Это хорошо, но вы на самом деле не нужны двойные кавычки внутри двойных скобок тест. Вам не нужно дважды равна либо. Это до вас.

echo "Usage: $0 \"\$@\"" >&2

Использовать функции printf и одинарные кавычки для лучшей читабельности. Вы сразу узнаете "$@" не развернуть в одинарные кавычки, а "$0" расширяется до Е интерполирует его.

printf 'Usage: %s "$@"\n' "$0" >&2

...

for arg in "$@" ; do    # arg will be each positional parameter

Так же, как для арг не в "$@" часть. До вас.

if [[ ${arg:0:1} == - ]]    # if $arg begins with -

Более эффективно написано:

if [[ $arg = -* ]]

...

function isoption ()
{

if [[ $O1P2T3I4O5N6 =~ ^.*-${1}-.*$ ]]
then return 0
else return 1
fi
}

Приятной особенностью Баш заключается в том, что возвращение всегда возвращает значение $?, так что вы могли бы написать это:

[[ $O1P2T3I4O5N6 =~ ^.*-${1}-.*$ ]]
return

Но если вы предпочитаете явный, ваш код нормально.


К примеру часть:

echo
echo These $# command line arguments are provided:
echo "$@"

Использование эхо-это единственное, что я думаю, что это на самом деле не так. Эхо принимает параметры (-нее), так что вы никогда не должны давать его без прикрас "$@" на выход. Использовать функции printf здесь.

printf '%s ' "$@"; echo

А остальное нормально. Очень хорошая работа!

2
ответ дан 26 ноября 2011 в 02:11 Источник Поделиться