локальная переменная и звездочка - PullRequest
0 голосов
/ 30 мая 2011

Я объявил переменную LOCAL (a) внутри функции, которая получает значение первого параметра ($ {1}).Когда я вызываю его со звездочкой в ​​содержании первого параметра, присвоение значения было другим.Почему?

# function_name () { local a="${1}"; echo $a; }
# set -xv && function_name "param_1_*" && set +xv
set -xv && function_name "param_1_*" && set +xv
+ set -xv
+ function_name 'param_1_*'
+ local 'a=param_1_*'
+ echo 'param_1_*'
param_1_*
+ set +xv

ПРИМЕЧАНИЕ: + local 'a = param_1 _ *' <- Видите?кавычка вставляется перед именем переменной "a" </p>

# function_name () { a="${1}"; echo $a; }
# set -xv && function_name "param_1_*" && set +xv
+ function_name 'param_1_*'
+ a='param_1_*'
+ echo 'param_1_*'
param_1_*
+ set +xv

ПРИМЕЧАНИЕ: + a = 'param_1 _ *' <- в этом случае кавычка вставляется после сигнала равенства</p>

Ответы [ 2 ]

1 голос
/ 30 мая 2011

Они отображаются по-разному в режиме -x bash, но это не значит, что bash относится к ним по-разному.Здесь происходит следующее: когда bash выполняет local a="${1}", он анализирует его во внутреннем представлении (что-то более сложное, чем строка), подставляет в него первый параметр, а затем замечает, что активен режим -x.Поэтому он принимает это внутреннее представление и разбирает его на команду, которую можно ввести, чтобы получить тот же эффект.В общем, будет несколько способов ввода команды, которая даст такой же эффект (т. Е. Внутреннее представление), и она выбирает один из них.Он может напечатать любое из следующего:

+ local a='param_1_*'
+ local 'a=param_1_*'
+ local $'a=param_1_*'
+ local a=param_1_"*"
+ local a=param_1_\*

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

Кстати, как сказал @Rob, есть разница в том, что a='param_1_*' и'a=param_1_*' являются не эквивалентными командами, в то время как local a='param_1_*' и local 'a=param_1_*' эквивалентны.Это связано с тем, что с локальной командой присваивание является по существу параметром, и заключать его в кавычки не так важно, как с автономным присваиванием.Таким образом, при отображении a="${1}" он может напечатать любой из:

+ a='param_1_*'
+ a="param_1_*"
+ a=param_1_$'*'
+ a=param_1_\*

, но не любой из них:

+ 'a=param_1_*'
+ "a=param_1_*"
+ $'a=param_1_*'
1 голос
/ 30 мая 2011

Не думаю, что звездочка - это разница.В ваших двух функциях одна объявляет локальную, а другая устанавливает переменную оболочки.В первом случае вы передаете a=param_1_* в качестве аргумента локальной встроенной функции (и оболочке все равно, является ли один из этих символов * или =), но во втором оболочкаразбор a=foo на его компоненты.В первом случае имеет смысл ставить кавычки вокруг всего аргумента, который равен a=param_1_*, но во втором это не имеет смысла, поскольку вы не могли действительно набрать 'a=param_1_*' в приглашении оболочки и ожидатьоболочка для установки переменной.

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