Что делают ${1} и ${*}?

Этот скрипт Nagios использует ${1} и ${*} вот так

if [ "${1}" ]; then
    if [ "${ERRORSTRING}" ]; then
        echo "${ERRORSTRING} ${OKSTRING}" | sed s/"^\/ "// | mail -s "$(hostname -s): ${0} reports errors\
" -E ${*}
    fi
else
    if [ "${ERRORSTRING}" -o "${OKSTRING}" ]; then
        echo "${ERRORSTRING} ${OKSTRING}" | sed s/"^\/ "//
        exit ${ERR}
    else
        echo no zpool volumes found
        exit 3
    fi
fi

Вопрос

Что делают ${1} и ${*}?


person Sandra Schlichting    schedule 07.01.2014    source источник


Ответы (3)


Аргументы командной строки $1, $2, $3,...$9 являются позиционными параметрами, где $0 указывает на фактическую команду, программу, сценарий оболочки или функцию, а $1, $2, $3, ...$9 — в качестве аргументов команда.

Специальный параметр "$*" принимает весь список как один аргумент с пробелами между ними, а специальный параметр "$@" принимает весь список и разделяет его на отдельные аргументы.

Предположим, что test.sh приведен ниже:

#!/bin/sh 
echo "File Name: $0" 
echo "First Parameter : $1" 
echo "First Parameter : $2" 
echo "Quoted Values: $@" 
echo "Quoted Values: $*" 
echo "Total Number of Parameters : $#"

введите здесь описание изображения

person Tajinder    schedule 07.01.2014

Цитата из Специальные параметры в руководстве:

*

Расширяется до позиционных параметров, начиная с единицы. Когда расширение происходит в двойных кавычках, оно расширяется до одного слова со значением каждого параметра, разделенным первым символом специальной переменной IFS. То есть "$*" эквивалентно "$1c$2c…", где c — первый символ значения переменной IFS. Если IFS не задано, параметры разделяются пробелами. Если IFS равно null, параметры объединяются без промежуточных разделителей.

$1 относится к позиционному параметру.


Предположим, следующий скрипт:

echo "${1}"
echo "${*}"

При вызове, говоря:

bash scriptname foo bar baz

это будет производить:

foo
foo bar baz

Теперь понаблюдайте за действием переменной IFS. Учитывая сценарий:

IFS=
echo "${1}"
echo "${*}"
echo "${@}"

Вызовите его, сказав:

bash scriptname "foo:hey you" bar baz

будет производить:

foo:hey you
foo:hey youbarbaz
foo:hey you bar baz
person devnull    schedule 07.01.2014

$1 используется (для интерактивного отображения или ввода данных пользователем) для отображения первого параметра.

$* используется для отображения всех введенных параметров.

 # cat schecking.sh
 #!/bin/bash
 echo "All values:" "$*"
 echo "Total number of Parameter(s) :" "$#"

 # ./schecking.sh
 All values:
 Total number of Parameter(s) : 0

 # ./schecking.sh It will help us to check
 All values: It will help us to check
 Total number of Parameter(s) : 6

 # cat schecking.sh
 #!/bin/bash
 echo "First value is:" $1
 echo "All values:" "$*"
 echo "Total number of Parameter(s) :" "$#"

 # ./schecking.sh It will help us to check
 First value is: It
 All values: It will help us to check
 Total number of Parameter(s) : 6
person Ranjithkumar T    schedule 07.01.2014