我正在这些论坛上搜索并尝试不同的代码,但我似乎无法让它工作:
我有一个变量
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
will (假设变量的默认值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