我正在尝试编写一个bash脚本,但是有一个问题 - 我无法在do-done之外看到变量的内容。有什么帮助吗?
#!/bin/bash
file="ip.txt"
while IFS=: read -r f1 f2 f3
do
printf '%s %s %s\n' "$f1" "$f2" "$f3"
done <"$file"
printf '%s %s %s\n' "$f1" "$f2" "$f3"
echo -e "iptables -t nat -A PREROUTING -p tcp --dport $f2 -j DNAT --to-destination $f1:$f3"
输出&GT;
192.168.0.1
2000
1000
iptables -t nat -A PREROUTING -p tcp --dport -j DNAT --to-destination :
答案 0 :(得分:1)
问题是你的文件末尾有一个空行,因此$ f1 $ f2 $ f3在循环的最后一次迭代时变空了吗?
答案 1 :(得分:0)
其已知的bash行为。请阅读此处,原因以及如何避免:http://mywiki.wooledge.org/BashPitfalls#grep_foo_bar_.7C_while_read_-或http://mywiki.wooledge.org/BashFAQ/024
答案 2 :(得分:0)
我可以用
看到你的问题while IFS=: read -r f1 f2 f3
do
printf 'Loop: %s %s %s\n' "$f1" "$f2" "$f3"
done <<< "192.168.0.1:2000:1000"
printf 'After: %s %s %s\n' "$f1" "$f2" "$f3"
您构建了一个构造,您可以使用循环中设置的变量,但不能使用read设置的变量。 你可以使用
while IFS=: read -r xf1 xf2 xf3
do
printf 'Loop: %s %s %s\n' "$xf1" "$xf2" "$xf3"
f1=$xf1
f2=$xf2
f3=$xf3
done <<< "192.168.0.1:2000:1000"
printf 'After: %s %s %s\n' "$f1" "$f2" "$f3"
我猜你不想使用这个,所以请阅读循环内的一行:
while read -r line
do
IFS=: read -r f1 f2 f3 <<< "${line}"
printf 'Loop: %s %s %s\n' "$f1" "$f2" "$f3"
done <<< "192.168.0.1:2000:1000"
printf 'After: %s %s %s\n' "$f1" "$f2" "$f3"