Bash에서는 다음 함수를 호출합니다.
myFunction "1 2"
myFunction()
{
echo "$1"
echo "$2"
}
그러면 "1 2"와 빈 줄이 인쇄됩니다. 한 라인 1과 다른 라인 2에 인쇄되도록 매개변수를 어떻게 구문 분석합니까? myFunction "1" "2"
매개변수가 다른 변수에 저장되어 있어서 호출할 수 없습니다
답변1
함수가 받는 첫 번째 인수를 공백 문자로 분할하려는 것 같습니다. 이렇게 하려면 공백을 구분 기호로 사용하도록 분할 부분을 구성하고 glob 부분을 비활성화한 후 분할+glob 연산자를 사용할 수 있습니다.
myfunction() {
local - # make changes to options local to the function.
# needs bash 4.4 or newer.
local IFS=' ' # split on space only
set -o noglob # disable glob part
set -- $1 # split+glob invoked on $1 by leaving that $1 unquoted,
# result stored in $1, $2... using set --
printf '%s\n' "$1"
printf '%s\n' "$2"
}
myfunction "1 2"
답변2
이는 공백에서 변수를 분할하는 것과 같습니다. 분사를 사용하거나 read
:
분사로:
var="foo bar"
set -f # disable globbing
IFS=' ' # make sure IFS contains (just) a space
printf "%s\n" $var
표준 셸 의 경우 read
(분할할 부분이 두 개뿐인 경우):
var="foo bar"
IFS=' ' read a b <<EOF
$var
EOF
printf "%s\n" "$a" "$b"
여기 문자열과 동일합니다(Bash/ksh/zsh):
var="foo bar"
IFS=' ' read a b <<< "$var"
printf "%s\n" "$a" "$b"
read -a
Bash 또는 ksh/zsh 에서는 read -A
문자열을 여러 조각으로 분할하여 배열에 넣을 수 있습니다.
var="foo bar"
IFS=' ' read -a arr <<< "$var" # Bash
printf "%s\n" "${arr[@]}"
위의 모든 항목에서는 평소 $1
와 같이 사용할 수 있습니다 $var
.
또한 변형은 read
문자열에 여러 줄이 포함되어 있지 않다고 가정합니다.
그러나 Bash에서는 공백을 구분 기호로 사용하여 여러 줄 문자열을 배열로 분할할 수도 있습니다.
IFS=$' \t\n' read -d '' -a arr <<< "$var"
물론 함수 외부의 변수에 문자열을 넣고 실행하면 myFunction $var
함수가 실행되기 전에 변수가 여러 인수로 분할됩니다.
답변3
이 시도,
myFunction()
{
echo "$1"
echo "$2"
}
myFunction 1 2