Bash에서 문자열을 "단어" 배열로 변환

Bash에서 문자열을 "단어" 배열로 변환

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

VotePedro="Vote for Pedro"

배열이 필요합니다.

Vote
For
Pedro

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

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

답변1

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

설명하다:

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

답변2

대부분의 다른 Bourne 유사 쉘 에서 bash변수 확장을 따옴표 없이 두면(예: ) $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

답변3

깨는 것 외에도 $IFS원하는 곳 어디에서나 깨뜨릴 수 있습니다.

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

...공백으로 구분된 빈 필드도 허용됩니다.

관련 정보