Bash에서 문자열에서 "단어"배열로 이동


11

문자열에서 각 항목이 해당 문자열의 각 단어 인 배열로 이동해야합니다. 예를 들어 다음과 같이 시작하십시오.

VotePedro="Vote for Pedro"

배열이 필요합니다.

Vote
For
Pedro

그러면 다음과 같이 반복 할 수 있어야합니다.

for i in "${votePedroArray[@]}"
    do
    ## Do something
    done

답변:


11
VotePedro="Vote for Pedro"
votePedroArray=(${VotePedro})

괄호와 대괄호의 기능을 설명해 주시겠습니까? BASH를 처음 사용하고 왜 이것이 작동하는지 이해하고 싶습니다.
farid99

1
배열은 일반적으로 괄호를 사용하여 선언됩니다. 예를 들어 votePedroArray=("Vote" "For" "Pedro")길이 3의 배열을 제공합니다 .이 컨텍스트 ${VotePedro}와 동일 $VotePedro합니다. 개별 배열 요소에 액세스하려면 질문에서 for 루프에 대한 것과 유사한 대괄호를 사용할 수 있습니다. 예를 들어 ${votePedroArray[0]}배열의 첫 번째 요소입니다 (이 예의 경우 "투표")
airfishey

답변 주셔서 감사합니다. 찬성하지만 아직 평판이 충분하지 않습니다.
farid99

2
그리고 그것들을 반복하기 위해 : $ {votePedroArray [@]}의 투표; $ vote를 반향하십시오; 완료
Neil McGill

4

예를 들어 변수 확장을 인용 부호없이 그대로두면 $VotePedro다음 단계가 수행됩니다.

  1. 변수의 값을 찾으십시오.
  2. 각 공백 블록의 값을 문자열 목록으로 분할하십시오. 보다 일반적으로 구분 기호는 IFS변수 값의 문자입니다 . 기본적으로 공백, 탭 및 줄 바꿈입니다.
  3. 목록의 각 요소를 와일드 카드 패턴으로 해석하십시오. 패턴이 일부 파일과 일치하면 각 요소에 대해 해당 요소를 일치하는 파일 이름 목록으로 바꿉니다.

따라서 IFS와일드 카드 확장을 끄고 값이 따옴표 이외의 문자열 인 변수를 확장 하여 문자열을 공백으로 구분 된 요소 (기본값 인 ) 로 분할 할 수 있습니다 .

VotePedro="Vote for Pedro"
set -f
votePedroArray=($VotePedro)
set +f
for i in "${votePedroArray[@]}"; do 

사용 시점에서 직접 분할을 수행 할 수 있습니다. 이것은 배열이없는 sh와 같은 쉘에서도 작동합니다.

VotePedro="Vote for Pedro"
set -f
for i in ${votePedro}; do
  set +f
  
done
set +f

0

깨는 것 외에도 $IFS원하는대로 깨뜨릴 수 있습니다.

set ''
while case $var in
      (* *) ;; (*)
      ! a=("$var$@")
      esac
do    set '' "${var##* }$@"
      var=${var% "$2"}
done

... 공백으로 구분 된 null 필드를 허용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.