루프에서 변수를 여러 변수로 분할

루프에서 변수를 여러 변수로 분할

이 포럼에서 검색하고 다른 코드를 시도하고 있지만 제대로 작동하지 않는 것 같습니다.

변수가 있어요

ip="192.168.1.227 192.168.1.205 192.168.1.217"

아니요, 각 IP 주소를 다른 변수로 분리하고 싶습니다.

ip1=192.168.1.227
ip2=192.168.1.205
ip3=192.168.1.217

말로 뭔가를 하려고 하는데

for ((word in $vds; i=0; i++));
do
echo $word
"ip$i"=$word
done

그러나 나는 그것을 작동시킬 수 없습니다.

답변1

당신이 그럴 가능성은 거의 없습니다실제로각 개별 IP 번호에 별도의 변수를 할당하고 싶습니다. IP 번호를 배열에 저장하면 관리가 더 쉬워집니다.

ipnumbers=( $ip )

따옴표가 없는 이 사용은 $ip(변수의 기본값을 가정하여 IFS) 해당 값을 공백으로 분할하고 결과 단어에 대해 파일 이름 와일드카드를 호출하지만 데이터에 파일 이름 와일드카드 패턴이 없기 때문에 문제가 되지 않습니다. 그런 다음 분할된 단어를 배열의 별도 요소로 할당합니다 ipnumbers.

그런 다음 (두 번째 요소의 경우)을 사용하여 개별 요소에 액세스 "${ipnumbers[1]}"하거나 루프를 사용하여 반복 할 수 있습니다.

for ipnum in "${ipnumbers[@]}"; do ...; done 

답변2

배열변수를 사용하는 것이 더 좋습니다.

 readarray -t -d ' ' ips <<<"$ip"

*이것은 종종 개행, 전역 문자( , ?, []) 등에 문제를 일으키는 "인용되지 않은" 쉘 분할을 사용하지 않습니다. 그런 다음 배열을 인쇄하십시오.

 printf '%s\n'  "${ips[@]}"

또는 루프에서 사용하십시오.

for i in "${ips[@]}"; do
    echo "$i"
done

답변3

분명히 배열이 선호되는 접근 방식이지만, 정말로 별도의 버전이 필요한 경우에는 ip$number다음을 시도해 보십시오.

  • eval귀하의 ip$i=$word과제는 참고 자료를 주의 깊게 살펴봅니다(더 이상 사용되지 않는 예방 조치를 염두에 두십시오 eval).
  • 작은 루프는 다음과 같습니다for word in $ip; do read ip$((++CNT)) <<< $word; done

관련 정보