Понимание параметров в функции - PullRequest
1 голос
/ 09 сентября 2011

Я нашел эту функцию:

findsit()
{
    OPTIND=1
    local case=""
    local usage="findsit: find string in files.
Usage: fstr [-i] \"pattern\" [\"filename pattern\"] "
    while getopts :it opt
    do
        case "$opt" in
        i) case="-i " ;;
        *) echo "$usage"; return;;
        esac
    done
    shift $(( $OPTIND - 1 ))
    if [ "$#" -lt 1 ]; then
        echo "$usage"
        return;
    fi
    find . -type f -name "${2:-*}" -print0 | \
    xargs -0 egrep --color=always -sn ${case} "$1" 2>&- | more 
}

Я понимаю вывод и то, что он делает, но есть некоторые термины, которые я до сих пор не понимаю, и мне трудно найти ссылку, но полагаю, что они будутбыть полезным, чтобы учиться в моем программировании.Кто-нибудь может их быстро объяснить?У некоторых нет man-страниц.

local

getopts

case

shift

$ #

$ {2: - *}

2> & -

Спасибо.

Ответы [ 2 ]

3 голосов
/ 09 сентября 2011
  • local : локальная переменная.Допустим, в вашей программе была переменная с именем foo.Вы вызываете функцию, которая также имеет переменную foo.Допустим, функция меняет значение foo.

Попробуйте эту программу:

testme()
{
    foo="barfoo"
    echo "In function: $foo"
}

foo="bar"
echo "In program: $foo"
testme
echo "After function in program: $foo"

Обратите внимание, что значение $foo было изменено функцией даже после ее завершения.Объявляя local foo="barfoo" вместо просто foo="barfoo", мы могли бы предотвратить это.

  • case : оператор case - это способ указания списка опций ичто вы хотите сделать с каждым из этих вариантов.Это что-то вроде оператора if / then / else.

Эти два более или менее равнозначны:

if [[ "$foo" == "bar" ]]
then
   echo "He said 'bar'!"
elif [[ "$foo" == "foo" ]]
then
  echo "Don't repeat yourself!"
elif [[ "$foo" == "foobar" ]]
then
  echo "Shouldn't it be 'fubar'?"
else
   echo "You didn't put anything I understand"
fi

и

case $foo in
    bar)
        echo "He said 'bar'!"
        ;;
    foo)
        echo "Don't repeat yourself!"
        ;;
    foobar)
        echo "Shouldn't it be 'fubar'?"
        ;;
    *)
        echo "You didn't put anything I understand"
        ;;
esac

The;; завершает опцию case.В противном случае он перейдет к следующему и выполнит эти строки тоже.У меня есть каждая опция в трех строках, но они обычно объединяются как

foobar) echo "Shouldn't it be 'fubar'?";;
  • shift : аргументы командной строки помещаются в переменную с именем $*.Когда вы говорите shift, он принимает первое значение в этой переменной $* и удаляет его.

  • getopts : Getopts - довольно сложная команда.Он используется для анализа значения однобуквенных опций в переменной $@ (которая содержит параметры и аргументы из командной строки).Обычно вы используете getopts в цикле while и используете оператор case для анализа выходных данных.Формат getopts <options> var.var - это переменная, которая будет содержать каждый параметр по одному.Укажите параметры одной буквы, и какие из них требуют аргумента.Лучший способ объяснить это - показать вам простой пример .

  • $ # : количество параметров / аргументов в командеline.

  • $ {var: -alternative} : Это говорит об использовании значения переменной среды $var.Однако, если эта переменная среды не установлена ​​или имеет значение null, используйте вместо этого значение alternative.В этой программе вместо этого используется $ {2: - *}.$2 представляет второй параметр того, что осталось в параметрах / аргументах командной строки после того, как все было удалено из-за команды shift.

  • 2> &- : это перемещает стандартную ошибку в стандартный вывод.Стандартная ошибка - это место, где помещаются сообщения об ошибках.Обычно они размещаются на экране вашего терминала так же, как стандартный вывод.Однако, если вы перенаправите свой вывод в файл, сообщения об ошибках все еще будут напечатаны в окне терминала.В этом случае перенаправление вывода в файл также перенаправит все сообщения об ошибках.

2 голосов
/ 09 сентября 2011

Это встроенные команды bash. Вы должны прочитать справочную страницу bash или, для getopts, попробовать help getopts

По одному (очень неудобно печатать на ipad и, следовательно, переключаться на ноутбук):

local позволяет вам определять локальные переменные (в рамках функции)

getopts - это встроенная утилита bash, которая реализует обработку аргументов в стиле getopt (аргументы типа -a, -b ...)

case - это форма bash для оператора switch. Синтаксис

case: case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac

shift сдвигает все аргументы на 1 (так что второй аргумент становится первым, третий становится вторым, ...) аналогично perl shift. Если вы укажете аргумент, он сместится на столько индексов (поэтому shift 2 назначит $3 -> $1, $4 -> $2, ...)

$# - количество аргументов, переданных функции

${2:-*} - форма аргумента по умолчанию. По сути, он смотрит на второй аргумент ($2 - это второй аргумент) и, если он не назначен, он заменит его на *.

2>&- - перенаправление вывода (в данном случае для стандартной ошибки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...