2017-04-16 80 views
-1

我正在嘗試寫一個bash腳本,但有一個問題 - 我看不到做完之外的變量的內容。任何幫助?Linux從bash scipt中提取值

#!/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" 

輸出>

192.168.0.1 
2000 
1000 

iptables -t nat -A PREROUTING -p tcp --dport -j DNAT --to-destination : 
+0

您可以檢查您的輸出?我認爲3值'​​192.168.0.1 2000 1000'在一行上。 –

+0

'read'將每個變量賦給最終讀取的空字符串。該空值對您的腳本完全可見! (只是不是特別有用) –

回答

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" 

你犯了一個建築,你可以使用在循環中設置的增值經銷商,但不是的由閱讀設置的變種。 您可以使用

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" 
1

不是吧,你有你的文件的最後一個空行的問題,並由此$ F1 F2 $ $ F3在最後一次迭代變空循環?

+0

不應該在這種情況下**兩個** * 1000 *和* iptables .... *之間的空輸出行?第一個空輸出行將來自循環內部的'printf',在那裏讀取所謂的空輸入行,第二行將在循環之後來自'printf'。 – user1934428

+0

@voyvoda:爲驗證JohanThomsen提出的想法,將循環內的'printf'改爲'printf'。f1 =%s f2 =%s f3 =%s \ n'「$ f1」「$ f2」 「$ f3」',這樣你可以更好地看到你什麼時候有空輸入 – user1934428