Чому $ 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. Будь ласка, спробуйте включити текст у запитання, а не в заголовок.
Rui F Ribeiro

Спасибі. Яким повинен бути аргумент ехо, якщо мені потрібно вставити в скрипт команди: print_something "$ 1"; print_something "$ 2"; а може й більше?
pietro letti

13
Коли я побачив це в HNQ, я подумав, що ви друкуєте доларові купюри, і сподівався прочитати якусь соковитий розповідь про те, як ваш принтер виявляє, що ви друкуєте підроблені гроші.
труба

@pipe У мене раніше це траплялося, я чомусь відмовляється друкувати що-небудь не лише ті, що мають запобігання друку.
Codingale

Відповіді:


41

Позиційні параметри відносяться до аргументів сценарію в основному рівні сценарію, але до функцій аргументів у тілі функції. Так

print_something Something

насправді було б надрукувати Something.

Якщо ви хочете передати аргументи сценарію функції, потрібно зробити це явно. Використовуйте

print_something "$1"

передати перший аргумент, або

print_something "$@"

щоб передати їх усі, хоча функція в прикладі використовує лише першу.


1
Перехід "$@"до print_something, як зараз написано, все-таки надрукував би лише перший аргумент.
Kusalananda

13
Але судження було в тому, щоб показати, як передавати всі аргументи, я припускаю. Те, що функція, як вона існує, використовує лише перший з її аргументів, трохи не має значення.
weirdan

Ну, тільки думаючи, що немає сенсу передавати всі аргументи, якщо використовується лише перший.
Кусалаланда

14
@allo No. "$*"- це один рядок (приєднаний до першого символу $IFS), а "$@"перелік елементів, що цитуються окремо.
Kusalananda

5
@Kusalananda Справа сказати тому, хто хоче передати параметри командного рядка функції, яку використовувати "$@", навіть якщо в цьому випадку є лише один такий параметр, - це охопити всі такі випадки. Якщо ОП вирішує додати другий параметр, виклик функції нічого не може змінити. А всі інші, хто це прочитає, навчиться правильно це робити, щоб потім не повторюватись.
Monty Harder

10

Це відбувається тому, що викликана функція отримує власний набір позиційних параметрів, незалежних від набору батьків / абонента. Спробуйте

print_something "$1"

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


Вам потрібно зрозуміти, про що ви говорите. Зазвичай, що телефонує, $1вони відрізняються від функцій $1, хоча вони МОЖУТЬ стати тими ж, якщо використовуватись як запропоновано вище. Якщо я зрозумію, що право echoможе залишатися таким же ( echo $1), коли функція викликається одним параметром ( print_something $2бере $ 1 абонента і "робить" $1всередині функції)
RudiC,

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.