대시: 문자열을 두 개의 변수로 구문 분석합니다.

대시: 문자열을 두 개의 변수로 구문 분석합니다.

구문 분석해야 하는 대시 스크립트가 있는데 , 이는 ''로 구분된 두 부분을 포함하는 문자열 $1입니다 . 예를 들어 $X 및 $Y 에 저장하고 싶습니다 .:foo:123foo123

나는 다음을 사용할 수 있다고 생각합니다 read.

$ echo "foo:123" | tr ':' ' ' | read X Y

하지만 이것은 작동하지 않습니다(오류가 발생하지 않음).

$ echo $X

빈 줄을 출력으로 제공합니다.

read구성이 작동하지 않는 이유는 무엇입니까? 목표를 달성하려면 어떻게 해야 하나요?(모든 솔루션, 읽기를 사용할 필요 없음)

답변1

존재하다스프린트, 각 명령관로 서브쉘에서 실행( zsh그리고 AT&T ksh,파이프라인의 가장 오른쪽 명령에는), 따라서 명령이 완료되면 변수 XY더 이상 존재하지 않습니다.

간단히 말해서, 당신은 사용할 수 있습니다매개변수 확장, 노력하다:

$ set -- foo:123
$ X=${1%:*}
$ Y=${1#*:}

이 예는 대화형 세션에 대한 것입니다.

스크립트에는 필요하지 않습니다 set -- foo:123.

답변2

당신은 또한 사용할 수 있습니다분할+전역연산자 (변수 인용 해제) (그리고 질문에 명백한 이유 없이 변수를 사용하고 있습니다):

IFS=:     # configure the split part to use : as the delimiter
set -f    # disable the glob part
set -- $1 # $1 is split on : and parts are stored in $1, $2...
X=$1 Y=$2

다음과 같이 할 수도 있습니다.

printf '%s\n' "$1" | {
  IFS=: read -r X Y
  printf '%s\n' "$X"
}

AT&T나 그 반대의 경우와 마찬가지로 dash파이프의 모든 부분은 서브셸에서 실행됩니다(동시에 실행되기 때문에 어쨌든 다른 프로세스에서 실행해야 합니다). 위에서는 이를 사용하는 부분을 및 의 출력을 읽는 서브셸에 넣어야 합니다.bashkshzsh$Xprintf세트 $X.

$1줄 바꿈이나 여러 문자가 포함된 경우 :두 솔루션은 다르게 작동합니다 .

관련 정보