2013-10-31 64 views
0

我將如何使用for循環編寫此Linux腳本?我試過Bash對於具有多個變量的循環

for i in {1..4} 
do 
    na$1=$(echo $na | cut -d. -f$i); 
done 

但它沒有正確執行。

na=$1; 
ba=$2; 
tff=255; 

na1=$(echo $na | cut -d. -f1); 
na2=$(echo $na | cut -d. -f2); 
na3=$(echo $na | cut -d. -f3); 
na4=$(echo $na | cut -d. -f4); 

ba1=$(echo $ba | cut -d. -f1); 
ba2=$(echo $ba | cut -d. -f2); 
ba3=$(echo $ba | cut -d. -f3); 
ba4=$(echo $ba | cut -d. -f4); 

oct1=$(expr $ba1 - $na1); 
oct2=$(expr $ba2 - $na2); 
oct3=$(expr $ba3 - $na3); 
oct4=$(expr $ba4 - $na4); 

sm1=$(expr $tff - $oct1); 
sm2=$(expr $tff - $oct2); 
sm3=$(expr $tff - $oct3); 
sm4=$(expr $tff - $oct4); 

NETADDR=$na1.$na2.$na3.$na4; 
BCAST=$ba1.$ba2.$ba3.$ba4; 
netmask=$sm1.$sm2.$sm3.$sm4; 
echo "sshd: $NETADDR/$netmask"; 
exit; 

,我發現了錯誤:

bash: line 15: na1=: command not found 
+0

'IFS =。閱讀na1 na2 na3 na4 <<< $ na'似乎比管道切割的多個回聲更清潔。它消除了循環的需要。如果你想避免bashisms並編寫一個不使用'<<<''的可移植腳本,請用heredoc:'IFS =寫入。閱讀na1 na2 na3 na4 << EOF \ n $ na \ nEOF \ n' –

回答

-1

從我明白你在吶在for循環$ 1拼寫錯誤,假設它的Na $ I

+1

變量只被掃描一次,所以O.P.需要使用'eval na $ i = ...'祝大家好運。 – shellter

+0

將它改爲'na $ i'不會使它工作。像這樣的作業需要一個恆定的名字。 – Kevin

-1

你不應該」把你的計數器包裹在{}中:

for i in 1..4 
do 
    na$1=$(echo $na | cut -d. -f$i); 
done 

雖然你正在使用的cut命令似乎還有一個問題。

+0

'1..4'中的i將循環一次,'i' ='1..4'。顯然不是他的意圖。 – Kevin

1

像這樣增加一個變量名與增加數組索引和使用索引一樣簡單得多。

#!/bin/bash 

na=$1 
ba=$2 

for i in {1..4}; do 
    na_array[$i]=$(echo $na | cut -d. -f$i) 
    ba_array[$i]=$(echo $ba | cut -d. -f$i) 
done 

NETADDR="${na_array[1]}.${na_array[2]}.${na_array[3]}.${na_array[4]}" 
BCAST="${ba_array[1]}.${ba_array[2]}.${ba_array[3]}.${ba_array[4]}" 

echo $NETADDR 
echo $BCAST 

請注意,我故意使用僞八位組來表明,雖然這回答你的問題,但它絕不會驗證輸入。

$ ./test.sh 187.659.134.215 256.919.00a.313 
187.659.134.215 
256.919.00a.313 

哦,並忽視關於從1..4刪除{}的帖子。這是錯誤的(對於bash)。

$ for i in 1..4; do echo $i; done 
1..4 
$ for i in {1..4}; do echo $i; done 
1 
2 
3 
4 
0

最直接的回答你的問題,你需要使用間接:

for i in {1..4} 
do 
    declare "na$1=$(echo $na | cut -d. -f$i)" 
done 

然後,您可以用

name=na$i 
echo ${!name} 

取而代之的是循環訪問變量,你可以使用

IFS=. read -a na_array <<<$na 
IFS=. read -a ba_array <<<$ba 

This wil l讀取$na的內容,將其拆分成$na_array.,將$ba分解爲$ba_array。然後可以使用${na_array[$i]}訪問索引$i處的數組元素。

1

不推薦,但你可以使用一個declare聲明:

for i in {1..4} 
do 
    declare na$1=$(echo $na | cut -d. -f$i); 
done 

一個清潔的設計:

na=$1 
ba=$2 
tff=255 

IFS=. read -a nas <<<"$na" 
IFS=. read -a bas <<<"$ba" 

sms=() 
for i in {1..4}; do 
oct=$((${nas[i]} - ${bas[i]})) 
sms[i]=$((tff - oct)) 
done 


NETADDR=$(printf "%d.%d.%d.%d" "${nas[@]}") 
BCAST=$(printf "%d.%d.%d.%d" "${bas[@]}") 
netmask=$(printf "%d.%d.%d.%d" "${sms[@]}") 
echo "sshd: $NETADDR/$netmask" 
exit