함수에서 $ 1이 스크립트의 첫 번째 인수를 인쇄하지 않는 이유는 무엇입니까?


13

이 간단한 bash 스크립트로 echo $1인쇄 하지 않는 이유는 무엇 $1입니까?

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

$ ./function.sh 123  -> why doesn't it print '123' as a result?

6
print_something을 호출 할 때 $ 1을 잊었 기 때문입니다. 제목이 아닌 질문에 텍스트를 포함 시키십시오.
Rui F Ribeiro

감사. 스크립트에 다음 명령을 삽입해야하는 경우 에코 인수는 무엇입니까? print_something "$ 1"; print_something "$ 2"; 그리고 더?
pietro letti

13
HNQ에서 이것을 보았을 때, 당신이 1 달러짜리 지폐를 인쇄하고 있다고 생각하고 프린터가 가짜 돈을 인쇄하고 있다는 것을 프린터가 어떻게 감지하는지에 대한 수분이 많은 이야기를 읽고 싶었습니다.
파이프

@pipe 나는 전에 그런 일이 있었는데, 어떤 이유로 안티 인쇄 방지 기능이있는 것뿐만 아니라 아무것도 인쇄하지 않습니다.
Codingale

답변:


41

위치 매개 변수는 스크립트의 기본 레벨에서 스크립트의 인수를 나타내지 만 함수 본문의 함수 인수 를 나타냅니다. 그래서

print_something Something

실제로 인쇄 Something합니다.

스크립트의 인수를 함수에 전달하려면 명시 적으로 수행해야합니다. 사용하다

print_something "$1"

첫 번째 인수를 전달하거나

print_something "$@"

예제의 함수는 첫 번째 함수 만 사용하지만 모두 전달합니다.


1
전달 "$@"print_something가 현재 기록 된 것 같이, 여전히 비록 인수의 첫 번째 인쇄 할 것이다.
Kusalananda

13
그러나 요점은 모든 주장을 어떻게 통과시키는 지를 보여주는 것이 었습니다 . 함수가 의미하는대로 첫 번째 인수 만 사용한다는 사실은 약간 관련이 없습니다.
weirdan

글쎄, 단지 첫 번째 인수 만 사용된다면 모든 인수를 전달할 필요가 없다고 생각합니다.
Kusalananda

14
@allo No. "$*"는 단일 문자열 (의 첫 문자에 결합 됨 $IFS)이고 "$@"개별적으로 인용 된 요소의 목록입니다.
Kusalananda

5
@Kusalananda 명령 행 매개 변수를 사용하려는 함수에게 전달하려는 사람에게이 매개 변수가 하나 뿐인 경우"$@" 에도 그러한 모든 매개 변수를 다루는 입니다. OP가 두 번째 매개 변수를 추가하기로 결정하면 함수 호출에서 변경할 사항이 없습니다. 그리고 이것을 읽는 다른 사람들은 나중에 다시 할 필요가 없도록 올바른 방법을 배울 것입니다.
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
확장 할 $ IFS로 구분 된 파일 패턴 목록으로 취급 echo $1하지 않는 한 사용 은 의미가 없습니다 $1. echo "$1"의 것 출력하지하지만 내용, 더 나을 $1의 값 $1처럼 -nene, -EE...
스테판 Chazelas가
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.