구문 분석해야 하는 대시 스크립트가 있는데 , 이는 ''로 구분된 두 부분을 포함하는 문자열 $1
입니다 . 예를 들어 $X 및 $Y 에 저장하고 싶습니다 .:
foo:123
foo
123
나는 다음을 사용할 수 있다고 생각합니다 read
.
$ echo "foo:123" | tr ':' ' ' | read X Y
하지만 이것은 작동하지 않습니다(오류가 발생하지 않음).
$ echo $X
빈 줄을 출력으로 제공합니다.
내 read
구성이 작동하지 않는 이유는 무엇입니까? 목표를 달성하려면 어떻게 해야 하나요?(모든 솔루션, 읽기를 사용할 필요 없음)
답변1
존재하다스프린트, 각 명령관로 서브쉘에서 실행( zsh
그리고 AT&T ksh
,파이프라인의 가장 오른쪽 명령에는), 따라서 명령이 완료되면 변수 X
및 Y
더 이상 존재하지 않습니다.
간단히 말해서, 당신은 사용할 수 있습니다매개변수 확장, 노력하다:
$ 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
파이프의 모든 부분은 서브셸에서 실행됩니다(동시에 실행되기 때문에 어쨌든 다른 프로세스에서 실행해야 합니다). 위에서는 이를 사용하는 부분을 및 의 출력을 읽는 서브셸에 넣어야 합니다.bash
ksh
zsh
$X
printf
세트 $X
.
$1
줄 바꿈이나 여러 문자가 포함된 경우 :
두 솔루션은 다르게 작동합니다 .