Bash에서 문자열에서 “단어”배열로 이동 다음과 같이 반복 할

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

VotePedro="Vote for Pedro"

배열이 필요합니다.

Vote
For
Pedro

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

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


답변

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

답변

예를 들어 변수 확장을 인용 부호없이 그대로두면 $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

답변

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

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

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