"$@"
다음과 같이 전체 인수에 대해 문자열 조작()을 수행하는 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>
읽다local
Ubuntu Wiki의 "Dash as /bin/sh" 페이지 섹션local args="$@"
, Dash는 다음과 같이 제품 라인을 확장하고 있는 것으로 보입니다 .
local args=foo bar baz
따라서 "foo"를 넣고 and args
를 (로컬?) 변수로 선언하면 됩니다. 실제로 매개변수를 추가하고 실행하면 변수를 추가하고 있음이 확인되는 것 같습니다.bar
baz
echo "bar: $bar"
my_func
=
$ foo.sh foo bar=baz
args: <foo>
bar: baz
그렇다면 $args
Dash에서 Bash와 유사한 동작("foo bar baz" 포함)을 얻을 수 있는 방법이 있습니까?
답변1
확장$@
local args="$@"
예명시되지 않은POSIX 표준 통과. 쉘은 bash
변수의 값으로 모든 위치 인수를 포함하는 공백으로 구분된 문자열을 생성하는 args
동시에 실행 등을 dash
시도합니다 .local args="$1" "$2" "$3"
쉘은 적어도 기본 구성에서 유사하게 작동합니다(첫 번째 문자가 구분 기호로 사용되지만 위치 인수에서 단일 문자열을 생성합니다) zsh
.ksh
bash
zsh
$IFS
yash
dash
귀하의 경우에는 사용해야합니다
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/sh
local
sh