Linux 多变量循环的Bash

Linux 多变量循环的Bash,linux,bash,Linux,Bash,如何使用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=$(

如何使用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

据我所知,您在for循环中有一个拼写错误na$1,假设它是na$I

您不应该将计数器包装在{}:

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

不过,您使用的cut命令似乎还有一个问题。

像这样递增变量名与递增数组索引是一样的,使用索引要简单得多

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

IFS=。读取-不建议使用na_数组,但可以使用
声明
语句:

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
na=$1
ba=2美元
tff=255

如果=。读取-nas和变量只扫描一次,因此O.P.需要使用
eval na$i=…
祝大家好运。将其更改为
na$i
将无法正常工作。像这样的赋值需要一个常量名。
对于1..4中的i将循环一次,使用
i
=
1..4
。显然不是他的本意。
IFS=。阅读na1-na2-na3-na4
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