Почему $ 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 "$@"

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.