在循环中将变量拆分为多个变量

在循环中将变量拆分为多个变量

我正在这些论坛上搜索并尝试不同的代码,但我似乎无法让它工作:

我有一个变量

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 )

这种不带引号的使用$ipwill (假设变量的默认值IFS)将其值拆分为空格(并在结果单词上调用文件名通配符,但这不应该成为问题,因为数据中没有文件名通配符模式)。然后它将分割的单词分配为数组中的单独元素ipnumbers

然后,您可以使用例如(对于第二个元素)访问各个元素"${ipnumbers[1]}",或者使用循环遍历它们

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

答案2

使用数组变量会更好。

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

这不使用“不带引号的”shell 分割,这通常会对换行符、全局字符 ( *, ?, []) 等产生问题。然后只需打印数组:

 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

相关内容