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

Обратный слеш является так называемым экранирующим символом и должен быть экранирован сам по себе, если он появляется в командной строке или в других местах, где обрабатываются экранирующие символы.

Имя пользователя с таким необычным символом внутри может вызвать проблемы в различных ситуациях. Лучше постараться избежать этого.

2
04.09.2019, 23:00
3 ответа

Мне не совсем понятно, о чем вы спрашиваете, но следующий пример может прояснить ситуацию:

$ cat script
#!/usr/bin/env bash

echo "Global 1st: ${1}"
echo "Global 2nd: ${2}"

f(){
    echo "In f() 1st: ${1}"
    echo "In f() 2nd: ${2}"
}

f "${1}" "${2}"

$./script foo bar
Global 1st: foo
Global 2nd: bar
In f() 1st: foo
In f() 2nd: bar
-2
27.01.2020, 21:58

Позиционные параметры области действия вызывающего объекта недоступны в функции. Вам нужно, чтобы вызывающий объект так или иначе передал их функции.

В bashэто можно сделать с помощью массива (, но имейте в виду, что массивы, отличные от "$@"в bash, начинаются с индекса 0 вместо 1 (, как в ksh, но в отличие от все остальные оболочки )).

f() {
  printf 'Caller $1: %s\n' "${caller_argv[0]}"
  printf '    My $1: %s\n' "$1"
}
caller_argv=("$@")
f blah

Или передать их дополнительно:

f() {
  printf 'Caller $1: %s\n' "$2"
  shift "$(($1 + 1))"
  printf 'My $1: %s\n' "$1"
}

f "$#" "$@" blah

Здесь $1содержит количество позиционных аргументов вызывающего объекта, поэтому fзнает, где начинаются его собственные аргументы.

7
27.01.2020, 21:58

В bash можно использовать переменную оболочки BASH _ARGV

shopt -s extdebug
# create the array BASH_ARGV with the parameter of the script
shopt -u extdebug
# No more need of extdebug but BASH_ARGV is created

f() {
  printf 'Caller $1: %s\n' ${BASH_ARGV[$((${#BASH_ARGV[*]}-1))]}
  printf '    My $1: %s\n' "$1"
}
f blah
1
27.01.2020, 21:58

Теги

Похожие вопросы