首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含多个变量的Bash For循环

包含多个变量的Bash For循环
EN

Stack Overflow用户
提问于 2013-10-31 08:40:35
回答 5查看 4K关注 0票数 0

如何使用for循环编写这个Linux脚本?我试过了

代码语言:javascript
复制
for i in {1..4}
do
  na$1=$(echo $na | cut -d. -f$i);
done

但是它没有正确执行。

代码语言:javascript
复制
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;

我得到了一个错误:

代码语言:javascript
复制
bash: line 15: na1=: command not found
EN

回答 5

Stack Overflow用户

发布于 2013-10-31 10:49:01

像这样递增变量名与递增数组索引是相同的事情,使用索引要简单得多。

代码语言:javascript
复制
#!/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

请注意,我有意使用伪八位数来表明,虽然这回答了您的问题,但它根本无法验证输入。

代码语言:javascript
复制
$ ./test.sh 187.659.134.215 256.919.00a.313
187.659.134.215
256.919.00a.313

哦,忽略关于从1..4中删除{}的帖子。这是错误的(对于bash)。

代码语言:javascript
复制
$ 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
EN

Stack Overflow用户

发布于 2013-10-31 21:31:14

不推荐使用,但您可以使用declare语句:

代码语言:javascript
复制
for i in {1..4}
do
  declare na$1=$(echo $na | cut -d. -f$i);
done

更简洁的设计:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2013-10-31 11:36:17

最直接地回答你的问题,你需要使用间接:

代码语言:javascript
复制
for i in {1..4}
do
  declare "na$1=$(echo $na | cut -d. -f$i)"
done

然后,可以使用以下命令访问该变量

代码语言:javascript
复制
name=na$i
echo ${!name}

您可以使用以下命令代替循环

代码语言:javascript
复制
IFS=. read -a na_array <<<$na
IFS=. read -a ba_array <<<$ba

这将读取$na的内容,并通过.将其拆分为数组$na_array,将$ba拆分为$ba_array。然后可以使用${na_array[$i]}访问索引$i处的数组元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19696461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档