![루프에서 변수를 여러 변수로 분할](https://linux55.com/image/143386/%EB%A3%A8%ED%94%84%EC%97%90%EC%84%9C%20%EB%B3%80%EC%88%98%EB%A5%BC%20%EC%97%AC%EB%9F%AC%20%EB%B3%80%EC%88%98%EB%A1%9C%20%EB%B6%84%ED%95%A0.png)
이 포럼에서 검색하고 다른 코드를 시도하고 있지만 제대로 작동하지 않는 것 같습니다.
변수가 있어요
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