條件選擇if語句
if語句是選擇執行的,條件滿足則執行,不滿足則退出,if語句也可嵌套,就是if語句里面也可以在進行if語句
單分支
if 判斷條件;then
statement1
fi
雙分支
if 判斷條件;then
條件為真得分支
else
條件為假的分支
fi
多分支語句
if 判斷條件1;then
if-true
elif 判斷條件2;then
if-true
elif 判斷條件3;then
if true
中間省略
else
all-false
fi
逐一對條件進行判斷,第一次遇到為真的條件時,執行其分支,而后結束真個if語句
條件判斷:case語句
case 變量引用 in
pattern1)
分支1
;;
pattern2)
分支2
;;
……
*)
默認分支
;;
esac
注意:每個分之后必須要跟兩個分號,結束符是case的反寫也就是esac,case也支持glob風格的通配符 *:任意長度的任意字符,?:任意單個字符,[]:指定范圍內的任意單個字符
a|b:a或b
示例
1、 寫一個腳本/root/bin/createuser.sh,實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶的id號等信息
使用if的雙分支語句來判斷用戶是否存在,如果存在就不執行添加用戶,反之,則添加,并顯示信息
#!/bin/bash
#
read -p "please input a username :" User
if [ id -u $User &>/dev/null ] ; then
echo "$User is exists…"
else
useradd $User
id $User
fi
2、 寫一個腳本/root/bin/yesorno.sh,提示用戶輸入yes或no,并判斷用戶輸入的是yes還是no,或是其它信息
這里使用到的是case語句,用戶輸入yes或no返回相應的信息,這里需要考慮腳本的健壯性,yes或no需要大小寫隨機組合也可以使Y|y|N|n等返回信息,這里可以使用通配符,但還有一種更簡單的方法,就是使用tr命令將用戶輸入的不管大寫小寫,統統轉換成小寫即可
#!/bin/bash
#
read -p "please input (yes |no) :" A
case $A in
[yY]|[yY][eE][Ss])
echo "The user input a $A"
;;
[nN]|[[nN][oO])
echo "The user input a $A"
;;
*)
echo "The user input other message" ;;
esac
#!/bin/bash
#
read -p "please input (yes |no) :" A
case $A in
echo $A |tr 'A-Z' 'a-z'
y|yes)
echo "The user input a $A"
;;
n|no)
echo "The user input a $A"
;;
*)
echo "The user input other message" ;;
esac
3、 寫一個腳本/root/bin/filetype.sh,判斷用戶輸入文件路徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)
判斷文件類型的前提是文件或目錄需要事先存在,首先就要判斷文件存在與否,存在則往下執行,否則退出
#!/bin/bash
#
read -p "please input a filepath:" File
[ ! -e $File ] && echo "$File is not exist " && exit 4
if [ -d $File ] ; then
echo "$File is a directory"
elif [ -h $File ] ;then
echo "$File is a link file "
elif [ -f $File ] ;then
echo "$File is a common file"
else
echo "$File is the other file…"
fi
4、 寫一個腳本/root/bin/checkint.sh,判斷用戶輸入的是否為正整數
使用變量來匹配字符串,匹配是否是屬于正整數當中的某個數字,符合則顯示為正整數,否則顯示不是
#!/bin/bash
#
read -p "please input a number: " Num
if [[ "$Num" =~ ^[1-9][0-9]*$ ]] ;then
echo "The Num is a integer"
else
echo " The Num is not a integer"
fi
5、判斷用戶user是否存在,如果不在將其創建
if id user1&>/dev/null ;then
echo “user1 is exists..”
else
useradd user1
fi
循環
將某代碼重復執行多少次,重復運行多少次,循環次數事先已知,循環次數實現未知,有進入條件和退出條件
shell的循環語句有如下幾種:
for循環
for 變量名 in 列表 ;do
循環體
done
執行機制:依次將列表中的元素賦值給“變量名”,每次復制后執行一次循環體;知道列表中的元素耗盡,循環結束
列表生成方式
直接給出列表
整數列表 {start..end},$(seq [start [stop] end]起始值,步徑,結束值
返回列表的命令$(command)
使用glob,如:*.sh
變量引用:
$@,$*(兩者的區別在使用引號時,前者表示的不是一個整體,后者表示所有的位置變量是一個整體)
while
while 條件判斷;do
循環體
done
條件判斷:循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為true,則執行一次循環;知道條件測試狀態為false終止循環,因此條件判斷一般有循環控制變量;而此變量的值會在循環體不斷被修正
進入條件:判斷條件為true
退出條件:判斷條件為false
until
until 條件判斷;do
循環體
done
進入條件:判斷條件 為false,剛好跟for,while相反
退出條件:判斷條件為true
示例:
1、 /etc/rc.d/rc3.d目錄下分別有多個以K開頭和以S開頭的文件;分別讀取每個文件,以k開頭的文件輸出為文件加stop ,以S開頭的文件輸出為文件名加start;
#!/bin/bash
for i in `ls /etc/rc.d/rc3.d/` ; do
if [[ $i =~ ^S.* ]] ;then
echo “$i start”
elif [[ $=~^K.* ]] ; then
echo “$i stop “
else
echo “unknow file”
fi
done
2、寫一個腳本,提示輸入正整數n的值,計算1+2+3+…n的總和
方法一:使用for循環
#!/bin/bash
declare i=1
declare -i sum=0
read –p “please input a number:’ Num
for i in [ 1 $Num ] ; do
let sum+=$i
done
echo $sum
方法二:使用while循環
#!/bin/bash
#
declare –i sum=0
declare –I i=1
whle [ $i –le 100 ];do
let sum+=$i
let i++
done
echo “The sum is $sum”
方法三:使用until循環
#!/bin/bash
#
declare –i i=0
until [ $i –gt 100 ] ;do
let sum+=$i
let i++
done
echo “The sum is $sum”
3、 寫一個腳本,提示請輸入網絡地址,如192.168.0.0,判斷輸入的網段中主機在線狀態
方法一:使用for循環
#!/bin/bash
#
read –p “please input a ipv4 address: “ IP
A=`echo $IP |cut -d . –f1-3`
for I in {1..255}
if ping -c1 –W1 $A.$i &>/dev/null; then
echo “$A.$i is up “
let up++ #計算能ping通的主機數量
else
echo “$A.$i is down”
let down++ #計算不能ping通的主機數量
fi
done
echo “The host $A.$i has $up up”
echo “The host $A.$i has $down down”
方法二:使用while循環
#!/bin/bash
#
declare –I i=0
while [ $i –le 254 ];do
if ping -c1 –W1 10.1.252.$i &>/dev/null ;then
echo “10.1.252.$i is up “
let up++
else
echo “10.1.252.$i is down “
let down ++
fi
let i++
done
echo “The host $A.$i has $up up”
echo “The host $A.$i has $down down”
方法三:使用until循環
#!/bin/bash
#
declare –I i=0
until [ $i –gt 254 ];do
if ping -c1 –W1 10.1.252.$i &>/dev/null ;then
echo “10.1.252.$i is up “
let up++
else
echo “10.1.252.$i is down “
let down ++
fi
let i++
done
echo “The host 10.1.252.$i has $up up”
echo “The host 10.1.252.$i has $down down”
4、 打印九九乘法表
使用循環依次打印,首先得有9行,定義一個變量取值范圍的1-9,然后就是列,找出99乘法表的規律,比如我行的初始值是1,那么我第一列只打印一個公式,列的取值范圍是小于行的數,依次循環,當我行的值8是,那么我的列的取值范圍也是1-8,內循環,從1*8,內部循環第一結束之后,列的數依次加一循環,當列的值大于行的值時,就退出內部循環,行的值再來加一,一直加到行的值大于9就停止循環
方法一:使用for循環
for循環實現
#!/bin/bash
#
for i in {1..9};do
for a in $(seq 1 $i) ;do
echo –en “${a}x${i}=$[a*i]\t”
done
echo
done
方法二:使用while循環
#!/bin/bash
#
declare –I i=1
while [ $i –le 9 ];do
declare –I a=1
while [ $a –le $i ];do
echo -ne "${a}x${i}=$[a*i]\t"
let a++
done
echo
let i++
done
方法三:使用until循環
#!/bin/bash
#
declare –I i=1
until [ $i –gt 9 ];do
declare –I a=1
until [ $a –gt $i ];do
echo -ne "${a}x${i}=$[a*i]\t"
let a++
done
echo
let i++
done
5、 利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者
首先定義最大值和最小值相等,之后隨即生成一個數字,將最大值與隨機數作比較,如果隨機數大于最大值,將隨機數的值賦給最大值,那么最小值也是如此,將最小值與隨機數作比較,如果隨機數的值小于最小值,將隨機數的值賦給最小值,最終最大值和最小值也就出來了
#!/bin/bash
#
max=$RANDOM
min=$max
for I in {1..10};do
rdm=$RANDOM
echo –ne “$rdm\t”
if [ $rdm –gt $max ] ; then
max=$rdm
elif [ $rdm –lt $min ] ;then
min=$rdm
fi
done
echo
echo “The max number is $max”
echo “The min number is $min”
方法二:使用while循環
#!/bin/bash
#
declare –I i=1
while [ $i le 10] ;do
rdm=$RANDOM
echo –ne “$rdm\t”
if [ $i –eq 1 ] ;then
max=$RANDOM
min=$max
if [ $rdm –gt $max ] ; then
max=$rdm
elif [ $rdm –lt $min ] ;then
min=$rdm
fi
done
echo
echo “The max number is $max”
echo “The min number is $min”
方法三:使用until循環
#!/bin/bash
#
declare –I i=1
until [ $i –gt 10 ] ;do
rdm=$RANDOM
echo –ne “$rdm\t”
if [ $i –eq 1 ] ;then
max=$RANDOM
min=$max
elif [ $rdm –gt $max ] ; then
max=$rdm
elif [ $rdm –lt $min ] ;then
min=$rdm
fi
done
echo
echo “The max number is $max”
echo “The min number is $min”
6、 打印國際象棋棋盤
方法一:使用for循環
國際棋盤的規律就是,顏色是交替出現的,這時可以用奇偶數來進行判斷,當行和列取模作差運算等于就說明是偶數,打印一個顏色,如果為奇數打印另一種顏色,顏色的控制利用空格加背景色來控制
#!/bin/bash
#
for in in {1..10}; do
for a in {1..10};do
if [ $[a%2 – i%2 ] –eq 0 ] ;then
echo -ne "\033[40m \033[0m"
else
echo echo -ne "\033[42m \033[0m"
fi
let a++
done
echo
let i++
done
方法二:使用while循環
#!/bin/bash
#
declare –I i=1
while [ $i –le 10 ]; do
declare –I a=1
while [ $a –le 10 ];do
if [ $[a%2 – i%2 ] –eq 0 ] ;then
echo -ne "\033[40m \033[0m"
else
echo echo -ne "\033[42m \033[0m"
fi
let a++
done
echo
let i++
done
7、 每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶hacker登錄,則將登錄時間和主機記錄于日志/var/log/login.log中,并提示該用戶退出系統。
#!/bin/bash
#
a=`who |grep "^hacker\>" |tr -s ' ' '%' |cut -d % -f3-4|tr '%' ' '`
tty=`who |grep "^hacker\>"|awk -F ' ' '{print $2}'`
host=` who |grep "^hacker\>" |cut -d \( -f2|cut -d \) -f1`
until false ; do
who |grep "^hacker\>"
if [ $? -eq 0 ] ; then
echo "$a\n$host" |write hacker $tty
fi
sleep 3
done
8、 隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出
#!/bin/bash
#
declare -i i=0
read -p "please input a number:" Num
until [ $Num -gt 10 ] ;do
a=`echo $[RANDOM%11]`
lif [[ $Num -gt $a ]] ;then
echo "upper"
exit 3
elif [[ $Num -lt $a ]];then
echo "lower"
exit 4
elif [[ $Numb -eq $a ]];then
echo "your are write"
exit 5
fi
done
9、打印等腰三角形
找出 等腰三角形的規律,下面一行跟上面的一行,相差2個字符,于是公式就是行數*2-1,這里還要控制前面的空白字符,不然打印出來的就不是等腰三角形,還需要找出空白字符的規律,空白字符的規律是總的行數減去當前行數得出的就是空白的字符數
#!/bin/bash
#
read -p "please input a number " n
for i in `seq $n`; do
for a in `seq $[$n-$i]`;do
echo -n " "
done
for b in `seq $[ i*2-1 ]`;do
echo -n "#"
done
echo
done
總結:上面的各種例子當中,都是用到循環來使用,有時也需要用if條件判斷,以達到最終實現要表現的效果,所以要熟悉掌握使用各種循環之間的嵌套
原創文章,作者:fszxxxks,如若轉載,請注明出處:http://www.www58058.com/37328