Чому $ 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.