如果問題不合適,我會事先道歉。我正在撰寫一個腳本,該腳本對 IP 地址的前三個八位位元組進行 greps 并將其發送到一個變數。接下來我想使用該變數并在 for 回圈中設定一個范圍,但它不起作用。
這是我的代碼;
device_ip=$(ip addr show eth1 | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.')
for i in {191..200};
do
printf device_ip | ping -c 1 "$device_ip""$i"
done
除了將兩個變陣列合到 ping 之外,它會做所有事情。輸出;
sh myscript.sh
ping: unknown host x.x.x.
x.x.x.{191..200}
誰能指出我正確的方向?我哪里錯了?
提前謝謝了,
uj5u.com熱心網友回復:
你能試試這個嗎?
device_ip=$(ip addr show eth1 | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.')
END=200
for ((i=191;i<=END;i ));
do
ping -c1 ${device_ip}${i}
done
uj5u.com熱心網友回復:
這對我有用:
for ip in $device_ip.{191..200}; do ping -c 1 $ip; done
有沒有可能你不使用bash?
檢查你的#!shebang線。如果您的第一行的前兩個字符不是#!,那么它只是一個注釋。
還,
printf device_ip | ping -c 1 "$device_ip""$i"
不會做你所期望的。它將把字串 "device_ip" 列印到 的 STDIN 上ping,它不會去讀取它。完全洗掉該printf陳述句,它沒有任何用途并且混淆了代碼。
此外,雖然這會起作用,但它在視覺上會無緣無故地有點嘈雜。"$device_ip""$i"在 處生成相同的輸出"$device_ip$i",更易于閱讀。也許更好,"${device_ip}${i}". 不過,這只是一種風格偏好。
uj5u.com熱心網友回復:
重擊:
#!/bin/bash
device_ip="$(ip -o -4 a sh eth1|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.'|head -1)" # make sure you get only the first IP, in case eth1 returns more than 1
for i in {191..200}
do
echo pinging IP: ${device_ip}${i}
ping -c1 ${device_ip}${i}
done
uj5u.com熱心網友回復:
這是一個可能的解決方案:
device_ip=($(ip -o address show eth0 | grep -Eo '([0-9]{1,3}\.){3}'))
for address in ${device_ip[0]}{191..200}; do
ping -c 1 $address
done
這是使用 Bash 匹配運算子的替代方法:
if [[ $(ip -o address show eth0) =~ ([0-9]{1,3}\.){3} ]]; then
for address in ${BASH_REMATCH}{191..200}; do
ping -c 1 $address
done
fi
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/451487.html
上一篇:什么是參考命令?
