Обратный слеш является так называемым экранирующим символом
и должен быть экранирован сам по себе, если он появляется в командной строке или в других местах, где обрабатываются экранирующие символы.
Имя пользователя с таким необычным символом внутри может вызвать проблемы в различных ситуациях. Лучше постараться избежать этого.
Мне не совсем понятно, о чем вы спрашиваете, но следующий пример может прояснить ситуацию:
$ 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
Позиционные параметры области действия вызывающего объекта недоступны в функции. Вам нужно, чтобы вызывающий объект так или иначе передал их функции.
В 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
знает, где начинаются его собственные аргументы.
В 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