[英]Using shift with case statement in bash
我試圖結合這兩個參數來使我的功能工作
#!/bin/bash
while [ $? -gt 0 ]
do
case "$1" in
[0-9]*-[0-9]*)
for ip in $(sec ${1%-*} ${##*-})
do
ping -c 1 192.168.1.$ip
(shift)?
done
;;
a)
>/dev/null;
[ $? -eq 0 ] && echo "192.168.1.$ip is up!" ||:;
;;
esac
done
通常,如果我把它們都放在[0-9]*-[0-9]*)
參數中,我們可以得到例如輸出
someTest.sh 90-105
它會檢查90到105之間的IP號碼但是我想這樣做:
sometest.sh 90-105 -a
我看到您要從命令行中指定的范圍內檢查機器是上升還是下降。 你可以使用for循環來完成它。
#!/bin/bash
a=$1;
b=$2;
for ((i=a;i<=b;i++)) do
ping -c 1 -w 1 192.168.1.$i >> /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "192.168.1.$i is up";
else
echo "192.168.1.$i is down";
fi
done
從命令行運行它: ./script 10 50
將機器從192.168.1.10 ping到192.168.1.50。
如果你想傳遞像: ./script 10-50
這樣的參數,你也可以這樣做:
#!/bin/bash
OLDIFS=$IFS
IFS=$'\-'
set $@
a=$1;
shift;
b=$1;
for ((i=a;i<=b;i++)) do
ping -c 1 -w 1 192.168.1.$i >> /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "192.168.1.$i is up";
else
echo "192.168.1.$i is down";
fi
done
IFS = $ OLDIFS
如果您想要做的是在一定范圍內ping IP,並且還能夠傳遞其他參數(-a和/或-b),您可以查看getopts以輕松處理所需數量的參數,或沒有選項:
usage()
{
cat << EOF
usage: $0 options iprange
OPTIONS:
-a set a option
-b set b option
-r set rangei, e.g 1 10
EOF
}
A=
B=
while getopts “abr:” OPTION
do
case $OPTION in
a)
A=1
;;
b)
B=1
;;
r)
RANGE="$OPTARG"
;;
?)
usage
exit
;;
esac
done
for i in $(seq $RANGE); do
ping -c 1 -w 1 192.168.1.$i >> /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "192.168.1.$i is up";
else
echo "192.168.1.$i is down";
fi
done
你會這樣稱呼:
./somescript.sh -a -b -r“10 34”
您可以檢查$ A和$ B變量,並根據它們的值執行您想要執行的操作。
我知道,在范圍延遲之間沒有划線並且你需要引號,快速寫下來,你可以使用類似KingsIndian的解決方案來解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.