Linux从bash scipt中提取值

时间:2017-04-16 14:19:52

标签: bash shell init

我正在尝试编写一个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 :

3 个答案:

答案 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"