如何使用for循环编写此Linux脚本?我试过了
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 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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
这将读取$na
的内容,将其$na_array
分割为.
,将$ba
分割为$ba_array
。然后,您可以使用$i
访问索引为${na_array[$i]}
的数组元素。
答案 3 :(得分:-1)
根据我的理解,你在for $循环中有一个拼写错误,假设它是na $ i
答案 4 :(得分:-1)
您不应将计数器包裹在{}:
中for i in 1..4
do
na$1=$(echo $na | cut -d. -f$i);
done
您正在使用的cut命令似乎还有一个问题。