bash 명령어 리눅스 셸 스크립트:분할 문자열, 그들을 배열에 넣어 다음 루프



쉘 스크립트 foreach (4)

루프 내의 코드에 대해 IFS를 엉망으로 만들고 싶지 않은 경우이 방법이 도움이 될 수 있습니다.

문자열에 공백이 없다는 것을 알고 있다면 ' ; '를 공백으로 사용하고 for / in 구문을 사용합니다.

#local str
for str in ${STR//;/ } ; do 
   echo "+ \"$str\""
done

그러나 공백이 있을 수 있다면이 접근법에서 임시 변수를 사용하여 "나머지"를 다음과 같이 유지해야합니다.

#local str rest
rest=$STR
while [ -n "$rest" ] ; do
   str=${rest%%;*}  # Everything up to the first ';'
   # Trim up to the first ';' -- and handle final case, too.
   [ "$rest" = "${rest/;/}" ] && rest= || rest=${rest#*;}
   echo "+ \"$str\""
done

가능한 중복 :
Bash에서 구분 기호를 기준으로 문자열을 분할 하시겠습니까?

bash 스크립트에서 어떻게 분리 기호로 문자열을 분할합니까 ; 그리고 결과 배열을 통해 루프?


Answer #1

다음은 사용할 수있는 예제 코드입니다.

$ STR="String;1;2;3"
$ for EACH in `echo "$STR" | grep -o -e "[^;]*"`; do
    echo "Found: \"$EACH\"";
done

grep -o -e "[^;] *"는 ';'이 아닌 다른 것을 선택하므로 문자열을 ';'로 분리합니다.

희망 그 도움.


Answer #2

다음은 $IFS 의존하지 않는 ashirazi의 답변에 대한 변형입니다. 그것은 아래에 ouline 자체 문제가 있습니다.

sentence="one;two;three"
sentence=${sentence//;/$'\n'}  # change the semicolons to white space
for word in $sentence
do
    echo "$word"
done

여기에 개행을 사용했지만 탭 " \t "또는 공백을 사용할 수 있습니다. 그러나 텍스트에있는 문자 중 하나라도 있다면 거기에서 분리됩니다. 이것이 $IFS 의 장점입니다. 분리자를 사용할 수있을뿐만 아니라 분리자를 사용할 수 없게됩니다. 변경하기 전에 값을 저장하십시오 - 다른 사람이 제안한대로.


Answer #3
sentence="one;two;three"
a="${sentence};"
while [ -n "${a}" ]
do
    echo ${a%%;*}
    a=${a#*;}
done




bash