쉘 스크립트에서 공백 앞뒤로 문자열을 분할하는 방법은 무엇입니까?

쉘 스크립트에서 공백 앞뒤로 문자열을 분할하는 방법은 무엇입니까?

아래와 같이 echo에 변수가 표시됩니다.

$ echo $var
129 148

출력값으로 129만 취해야 합니다. 129와 148을 어떻게 나누나요?

답변1

또한Jason Urine의 조언, 당신은 그것을 사용할 수 있습니다 cut:

echo $var | cut -d' ' -f1

cut출력은 echo공백 구분 기호( )를 사용하여 -d' '첫 번째 필드( -f1) 를 출력합니다.

답변2

영리한 방법은 bash 배열을 사용하여 문자열을 공백으로 분할하는 것입니다. 괄호를 사용하여 간단하게 배열을 선언할 수 있습니다.

var="129 148     181"
vars=( $var )
echo "First  word of var: '${vars[0]}'"
echo "Second word of var: '${vars[1]}'"
echo "Third  word of var: '${vars[2]}'"
echo "Number of words in var: '${#vars[@]}'"

답변3

긴 이야기 짧게

${var%% *}

$ echo "$var"
129 148
$ echo "${var%% *}"
129

논평

echo "${var% *}" && echo "${var#* }"... – 제이슨 우리안

귀하의 질문에 답변할 수 있는 방법은 무수히 많지만 가장 간단한 방법은 매개변수 확장입니다. 이는 Jason이 댓글에서 제안한 것입니다. 나는 이것이 이 문제를 해결하는 올바른 도구라고 믿습니다.

cut그런데, 여기에 있는 다른 답변에는 아무런 문제가 없습니다(파이프에서 배열로, 배열로 분할). 다음 문제를 더 쉽게 해결할 수 있는 다용도 솔루션입니다."그럼 두 번째나 n번째 숫자는 어떻게 알 수 있나요?"간단한 질문은 오랫동안 단순하게 유지되는 경우가 거의 없습니다.

결점

이 접근 방식은 모든 곳에서 작동하지 않을 수 있지만 그렇지 않은 곳을 찾기가 어렵습니다. 물론 bash대부분의 Unix 시스템에서는 기본 대화형 셸 에서 실행되고 zshMacOS에서는 기본 대화형 셸에서 실행됩니다. 깨질 것으로 예상되는 것과 깨질 것으로 예상되는 ash것과 같이 라우터에서 발견되는 제한된 쉘도 dash매개변수 확장을 사용하면 잘 작동합니다.

${var%% *}대조에 대한 참고 사항${var% *}

Jason이 제안한 기호 대신 2% 기호를 사용했음을 알 수 있습니다. 차이점 %%가장 긴일치 문자열 %합계가장 짧은. 예를 들어 var숫자 3개를 포함하면 다음과 같이 표시됩니다.

$ echo "$var"
129 148 167
$ echo "${var%% *}"
129
$ echo "${var% *}"
129 148

추가 읽기를 위해

여기까지 왔다면 "매개변수 확장이라는 마법에 대해 어디서 더 배울 수 있나요?"라고 궁금해하실 것입니다. 이에 대한 대답은 셸 문서에서 확인할 수 있습니다 man bash. 예를 들어 관련 섹션에서 발췌한 내용이 있습니다.매개변수 확장bash맨페이지 에서 :

일치하는 접두사 패턴을 제거합니다.

${범위#단어}

${범위##단어}

이것 단어 경로 이름 확장에서와 같이 패턴을 생성하도록 확장되고 확장된 값과 일치됩니다. 범위 아래에 설명된 규칙을 사용하세요. 패턴 매칭. 패턴이 값의 시작 부분과 일치하는 경우 범위, 확장 결과는 확장된 값입니다. 범위 가장 짧은 일치 패턴('#' 대소문자) 또는 가장 긴 일치 패턴('##' 사례)가 삭제되었습니다. 만약에 범위@ 또는 *, 패턴 제거 작업이 각 위치 인수에 차례로 적용되고 확장이 결과 목록입니다. 만약에 범위 배열 변수이고 아래 첨자는 다음과 같습니다. @ 또는 *, 패턴 삭제 작업이 배열의 각 멤버에 차례로 적용되고 확장이 결과 목록입니다.

일치하는 접미사 패턴을 제거합니다.

${범위%단어}

${범위%%단어}

이것단어경로 이름 확장에서와 같이 패턴을 생성하도록 확장되고 확장된 값과 일치됩니다. 범위 아래에 설명된 규칙을 사용하세요. 패턴 매칭. 패턴이 확장된 값의 후행 부분과 일치하는 경우 범위, 확장 결과는 확장된 값입니다. 범위 가장 짧은 일치 패턴('%' 대소문자) 또는 가장 긴 일치 패턴('%%' 사례)가 삭제되었습니다. 만약에 범위@ 또는 *, 패턴 제거 작업이 각 위치 인수에 차례로 적용되고 확장이 결과 목록입니다. 만약에 범위 배열 변수이고 아래 첨자는 다음과 같습니다. @ 또는 *, 패턴 삭제 작업이 배열의 각 멤버에 차례로 적용되고 확장이 결과 목록입니다.

답변4

다음과 같이 set 명령을 사용하여 공백을 따라 변수를 분할할 수 있습니다.

IFS=" "
set -- $var
echo $1
129

관련 정보