아래와 같이 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 시스템에서는 기본 대화형 셸 에서 실행되고 zsh
MacOS에서는 기본 대화형 셸에서 실행됩니다. 깨질 것으로 예상되는 것과 깨질 것으로 예상되는 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