0

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
4

5 に答える 5

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
于 2013-10-31T02:49:01.053 に答える
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配列に分割し、 に分割します。その後、を使用して index の配列要素にアクセスできます。$na_array.$ba$ba_array$i${na_array[$i]}

于 2013-10-31T03:36:16.777 に答える
-1

私が理解していることから、あなたは for ループの na$1 にスペルミスがあり、それを na$i と仮定しています

于 2013-10-31T01:06:11.480 に答える
-1

{} でカウンターをラップしないでください。

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

ただし、使用しているカット コマンドにはさらに問題があるようです。

于 2013-10-31T01:12:22.383 に答える