Bash 함수에서 공백이 있는 매개변수를 구문 분석하는 방법

Bash 함수에서 공백이 있는 매개변수를 구문 분석하는 방법

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 -aBash 또는 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

관련 정보