Почему $ 1 в функции не печатает первый аргумент скрипта?

13

Почему не echo $1печатать $1в этом простом скрипте bash?

#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something

$ ./function.sh 123  -> why doesn't it print '123' as a result?
Пьетро Летти
источник
6
потому что вы забыли $ 1 при вызове print_something. Пожалуйста, попробуйте включить текст в вопрос, а не в заголовок.
Руи Ф. Рибейро
Благодарю. Каким должен быть аргумент echo, если мне нужно вставить в скрипт команды: print_something "$ 1"; print_something "$ 2"; а может больше?
Пьетро Летти
13
Когда я увидел это в HNQ, я подумал, что вы печатаете долларовые купюры, и надеялся прочитать какую-нибудь сочную историю о том, как ваш принтер обнаруживает, что вы печатаете фальшивые деньги.
труба
@pipe У меня было такое раньше, по какой-то причине он отказывается печатать что-либо, не только что с антипечатной защитой.
Codingale

Ответы:

41

Позиционные параметры относятся к аргументам скрипта на основном уровне скрипта, но относятся к аргументам функции в теле функции. Так

print_something Something

будет на самом деле печатать Something.

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

print_something "$1"

передать первый аргумент, или

print_something "$@"

чтобы передать все из них, хотя функция в примере использует только первый.

weirdan
источник
1
Переход "$@"к print_something, как это написано в настоящее время, все равно будет выводить только первый аргумент.
Кусалананда
13
Но смысл был показать, как передать все аргументы, я полагаю. Тот факт, что функция в ее нынешнем виде использует только первый из своих аргументов, не имеет значения.
Weirdan
Ну, просто думать, что нет смысла передавать все аргументы, если используется только первый.
Кусалананда
14
@allo No. "$*"будет одной строкой (объединенной по первому символу $IFS), а "$@"будет списком индивидуально цитируемых элементов.
Кусалананда
5
@Kusalananda Смысл того, чтобы сообщить кому-либо, кто хочет передать параметры командной строки в функцию, которую нужно использовать "$@", даже если в этом случае есть только один такой параметр, - охватывать все такие случаи. Если OP решает добавить второй параметр, в вызове функции нечего менять. И все остальные, кто прочитает это, узнают, как это сделать, чтобы избежать необходимости делать это позже.
Монти Хардер
10

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

print_something "$1"

echo "$1", что еще лучше printf '%s\n' "$1", не забывайте указывать расширения параметров, которые echoнельзя использовать для произвольных данных).

Рудик
источник
Вам нужно прояснить, о чем вы говорите. Абоненты, $1как правило, отличаются от функций $1, хотя они МОГУТ становиться одинаковыми, если используются, как предложено выше. Если я правильно echoecho $1print_something $2$1
понял,
6
Использование echo $1не имеет смысла, если только вы не хотите, $1чтобы его считали списком шаблонов файлов, разделенных $ IFS, для расширения. echo "$1"будет иметь больше смысла, хотя бы не выводить содержание $1для значений , $1как -nene, -EE...
Stéphane Chazelas