从文件中读取行并对每一行进行标记以提取 shell 脚本中的特定单词
Read lines from a file and tokenize each line to extract specific word in shell script
我写了一个 shell 脚本来读取文件中的所有行,对每一行进行标记以提取特定的单词。
第一行阅读正确,但从第二行开始,预期的单词阅读不正确。期待您的建议。
while read -ra line;
do
netmask="${line[5]}"
echo "netmask is $netmask" // first line reading is correct, second line onwards its showing
wrong output
IFS='.' tokens=($netmask)
prefix=0
for i in 0 1 2 3
do
var="${tokens[$i]}"
# i have a logic to calculate number of 1's in the number.
done
done < routes.sh
route.sh 的内容是
route add -net 10.212.220.0 netmask 255.255.255.0 gw 10.213.248.1
route add -net 10.212.220.0 netmask 255.255.128.0 gw 10.213.248.1
实际产量
netmask is 255.255.255.0
netmask is 128
预期产出
netmask is 255.255.255.0
netmask is 255.255.128.0
补充说明:
我的objective是为了(网络概念)
- 从文件中读取所有行(每行描述一条路线)
- 从每一行提取网络掩码(例如:255.255.255.255)
- 用'.'对"255.255.255.255"进行分词,得到4个数,计算每个数中1的个数
令牌,将它们加起来。那将是网络 IP 的前缀长度。
问题是您设置了 IFS='.'
,因此数组 line
上的第二个 read
将被错误设置。
修复它的一种方法是保存原始 IFS
然后在适当的时候重置它。例如,
OldIFS=$IFS
while read -ra line; do
netmask="${line[5]}"
echo "netmask is $netmask"
IFS='.' tokens=($netmask)
prefix=0
for i in 0 1 2 3; do
var="${tokens[$i]}"
done
IFS=$OldIFS
done < routes.sh
修改IFS
一定要小心,否则会发生奇怪的事情
我写了一个 shell 脚本来读取文件中的所有行,对每一行进行标记以提取特定的单词。 第一行阅读正确,但从第二行开始,预期的单词阅读不正确。期待您的建议。
while read -ra line;
do
netmask="${line[5]}"
echo "netmask is $netmask" // first line reading is correct, second line onwards its showing
wrong output
IFS='.' tokens=($netmask)
prefix=0
for i in 0 1 2 3
do
var="${tokens[$i]}"
# i have a logic to calculate number of 1's in the number.
done
done < routes.sh
route.sh 的内容是
route add -net 10.212.220.0 netmask 255.255.255.0 gw 10.213.248.1
route add -net 10.212.220.0 netmask 255.255.128.0 gw 10.213.248.1
实际产量
netmask is 255.255.255.0
netmask is 128
预期产出
netmask is 255.255.255.0
netmask is 255.255.128.0
补充说明:
我的objective是为了(网络概念)
- 从文件中读取所有行(每行描述一条路线)
- 从每一行提取网络掩码(例如:255.255.255.255)
- 用'.'对"255.255.255.255"进行分词,得到4个数,计算每个数中1的个数 令牌,将它们加起来。那将是网络 IP 的前缀长度。
问题是您设置了 IFS='.'
,因此数组 line
上的第二个 read
将被错误设置。
修复它的一种方法是保存原始 IFS
然后在适当的时候重置它。例如,
OldIFS=$IFS
while read -ra line; do
netmask="${line[5]}"
echo "netmask is $netmask"
IFS='.' tokens=($netmask)
prefix=0
for i in 0 1 2 3; do
var="${tokens[$i]}"
done
IFS=$OldIFS
done < routes.sh
修改IFS
一定要小心,否则会发生奇怪的事情