대시의 지역 변수에 "$@"을 넣습니다.

대시의 지역 변수에 "$@"을 넣습니다.

"$@"다음과 같이 전체 인수에 대해 문자열 조작()을 수행하는 Bash 함수가 있습니다 .

my_func() {
    local args="$@"
    echo "args: <$args>"
}

my_func "$@"

Bash에서 실행하면 args모든 인수가 전달됩니다.

$ bash foo.sh foo bar baz
args: <foo bar baz>

그러나 Dash에서 실행하면 첫 번째 인수만 저장됩니다.

$ dash test.sh foo bar baz
args: <foo>

읽다localUbuntu Wiki의 "Dash as /bin/sh" 페이지 섹션local args="$@", Dash는 다음과 같이 제품 라인을 확장하고 있는 것으로 보입니다 .

local args=foo bar baz

따라서 "foo"를 넣고 and args를 (로컬?) 변수로 선언하면 됩니다. 실제로 매개변수를 추가하고 실행하면 변수를 추가하고 있음이 확인되는 것 같습니다.barbazecho "bar: $bar"my_func=

$ foo.sh foo bar=baz
args: <foo>
bar: baz

그렇다면 $argsDash에서 Bash와 유사한 동작("foo bar baz" 포함)을 얻을 수 있는 방법이 있습니까?

답변1

확장$@local args="$@" 명시되지 않은POSIX 표준 통과. 쉘은 bash변수의 값으로 모든 위치 인수를 포함하는 공백으로 구분된 문자열을 생성하는 args동시에 실행 등을 dash시도합니다 .local args="$1" "$2" "$3"

쉘은 적어도 기본 구성에서 유사하게 작동합니다(첫 번째 문자가 구분 기호로 사용되지만 위치 인수에서 단일 문자열을 생성합니다) zsh.kshbashzsh$IFSyashdash

귀하의 경우에는 사용해야합니다

my_func () {
    local args
    args="$*"

    printf 'args: <%s>\n' "$args"
}

또는

my_func () {
    local args="$*"

    printf 'args: <%s>\n' "$args"
}

$*여기서는 값 목록에서 단일 문자열을 구성하고 있음을 보여주기 위해 이를 사용하고 있습니다 . 문자열에는 첫 번째 문자 $IFS(기본값은 공백)로 구분된 위치 매개변수의 값이 포함됩니다.

printf또한 사용자가 제공한 값에 대해 올바른 출력을 얻는지 확인하기 위해 사용합니다 (참조왜 printf가 echo보다 나은가요?).

또한 스크립트는 표준 구문의 확장 이 #!/bin/dash아니라 첫 번째 줄로 사용되어야 합니다 .#!/bin/shlocalsh

관련 정보