一、條件判斷式語句
1.shell條件判斷式語句之按文件類型判斷
兩種判斷格式:①test -e /root/install.log
? ? ? ? ? ? ? ? ? ? ? ? ? ?②[ -e /root/install.log ]
例子:[ -e /root ]&&echo "yes" || echo "no"? #第一個判斷命令如果正確執(zhí)行,則打印“yes”,否則打印“no”沛膳。([和“-e”之間要加一個空格腿短,否則會報錯)
2.按文件權限判斷
判斷格式:[ -w student.txt ] && echo "yes" || echo "no"? #判斷文件是否有寫權限。不區(qū)分所有者
3.兩個文件之間的比較
?ln /root/student.txt /tmp/stu.txt #給student.txt創(chuàng)建個硬鏈接到/tmp下改名為stu.txt
判斷格式:[ /root/student.txt -ef /tmp/syu.txt ] && echo "yes" || echo "no" #判斷兩個文件的i節(jié)點號是否一致
4.兩個整數(shù)之間的比較
判斷格式:[ 23 -ge 22 ] && echo "yes" || echo "no" #判斷23是否大于等于22,結果為真碌更,輸出“yes”
5.字符串的判斷
name = fengj #給name變量賦值
判斷格式:[ -z "$name" ] && echo "yes" || echo "no" #判斷name變量是否為空动看,不為空尊剔,所以返回no
例子:aa=11 #給變量aa賦值
? ? ? ? ? ?bb==22#給變量bb賦值
[ “$aa” == "bb" ] &&? echo "yes" || echo "no" #判斷兩個變量是否相等,明顯不相等弧圆,返回no
注意:此處字符串和數(shù)值需要區(qū)分赋兵。
6.多重條件判斷
aa=11#給變量aa賦值
判斷格式:[ -n “$aa” -a "$aa" -gt 23 ] && echo "yes" || echo "no" #判斷變量aa是否有值,同時判斷aa是否大于33搔预。因為變量aa不大于23霹期,所以雖然第一個判斷值為真,返回的結果也為假拯田。
二历造、單分支if語句
1.if語句概述
學習腳本實例的好處:1.掌握語法結構2.了解shell的作用3.分析編程思想
建立編程思想的方法:1.熟悉Linux基本命令、規(guī)范船庇、語法及shell語法2.當遇到實際需求時吭产,應用所學知識。
如何“背”程序鸭轮?
1.抄寫代碼并能夠正確運行2.為程序補全注釋3.刪掉注釋臣淤,為代碼重新加注釋4.看注釋寫代碼5.刪掉代碼注釋,重頭開始寫窃爷。
2.單分支if語句
單分支if條件語句需要注意的幾個點:
1.if語句使用fi結尾邑蒋,和一般語言使用大括號結尾不同
2.[ 條件判斷式 ]計算使用test命令判斷,所以中括號和條件判斷式之間必須有空格
3.then后面跟符合條件之后執(zhí)行的程序按厘,可以放在[]之后医吊,用“ ; ”分割。也可以換行寫入逮京,就不需要“;”了卿堂。
例子:判斷登錄的用戶是否是root
#!/bin/bash
test=$(env | grep "USER" | cut -d "=" -f2)
if [ "$test" == root ]
? ? ? then
echo "current user is root懒棉!"
fi
3.例子—判斷分區(qū)使用率
#!/bin/bash
#統(tǒng)計根分區(qū)使用率草描,把根分區(qū)使用率作為變量值賦予變量rate
rate=$(df -h | grep "/dev/sda1" | awk '{print $5}' | cut -d "%" -f1)#awk:打印第五列 f1:提取第一列
if [ $rate -ge 80 ]? #rate是否大于等于80
then
?echo "warning! /dev/sda3 is full!!!!!"
fi?
三览绿、雙分支if語句
1.判斷輸入的是否有誤
例子:注意:記得給此sh腳本賦予權限:chmod 755 if2.sh
#!/bin/bash
read -t 30 -p "please input a dir:" dir? #用戶鍵盤輸入
if [ -d "$dir" ] # -d判斷是否是目錄
then
echo "輸入的是目錄"
else
echo“輸入的不是目錄”
fi
2.判斷Apache服務是否啟動
ps aux | grep httpd | grep -v grep?
?#查看系統(tǒng)中運行的進程,搜索出包含httped的剔除掉包含grep的進程
3.判斷例子
注意陶珠,需要給腳本賦予755權限
四挟裂、多分支if語句
1.語句簡介
2.例子:計算器
數(shù)值運算需要思考的內容:
1.有沒有輸入內容;2.判斷輸入的內容是不是數(shù)值揍诽;3.判斷輸入的運算符诀蓉;4.執(zhí)行運算符操作
#!/bin/bash
#字符界面加減乘除計算器。通過read命令接收要計算的數(shù)值暑脆,并賦予變量num1渠啤,num2
read -t 30 -p "please input num1:" num1
read -t 30 -p "please input num2:" num2
read -t 30 -p "please input a operator:"ope #接收要計算的符號,并賦予變量ope
if [ -n "$num1" -a -n "$num2" -a -n "$ope" ] #第一層判斷添吗,判斷3個變量都有值
then
test1=$(echo $num1 | sed 's/[0-9] //g')
test2=$(echo $num2 | sed 's/[0-9] //g)
#把變量test1的值替換為空沥曹,如果能替換為空。證明num1的值為數(shù)字碟联。如果不能替換為空妓美,證明num1的值為非數(shù)字。我們使用這種方法判斷變量num1的值為數(shù)字鲤孵。
? ? ? ? ? ?if [ -z "$test1" -a -z "$test2" ]
echo $test1 $test2
#第二層判斷壶栋,判斷num1和num2是數(shù)值。如果變量test1和test2的值為空普监,則證明num1和num2是數(shù)字
? ? ? ? ? ? then
#如果test1和test2是數(shù)字贵试,則執(zhí)行以下命令
? ? ? ? ? ? ? ? ? ? if [ "$ope" == ' + ' ]
#第三層判斷用來確認運算符,判斷變量ope是什么運算符
? ? ? ? ? ? ? ? ? ? ?then
? ? ? ? ? ? ? ? ? ? ?sum=$(( $num1 + $num2 ))
? ? ? ? ? ? ? ? ? ? ?elif [ "$ope" == ' - ' ]
? ? ? ? ? ? ? ? ? ? ?then
? ? ? ? ? ? ? ? ? ? ? sum=$(( ?$num1 + $num2?))
? ? ? ? ? ? ? ? ? ? ? elif?[ "$ope" == ' * ' ]? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ??then? ?
? ? ? ? ? ? ? ? ? ? ? ? sum=$((??$num1 * $num2??))?
? ? ? ? ? ? ? ? ? ? ? ? ?elif?[ "$ope" == ' / ' ]? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? then
? ? ? ? ? ? ? ? ? ? ? ? ? sum=$((??$num1 / $num2??))??
? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? echo "Please enter a vaild symbol!"
? ? ? ? ? ? ? ? ? ? exit 10?
? ? ? ? ? ? ? fi
? ? ? ? ? ?else
? ? ? ? ? ?echo "Please input a valid value "
? ? ? ? ? ?exit 11
? ? ?fi
else
echo "please input a num!!"
exit 12
fi
3.例子:判斷用戶輸入的是什么文件
#!/bin/bash
#判斷用戶輸入的是什么文件.-t:30s
read -t 30 -p "Please input a filename:" file
#接收鍵盤的輸入凯正,并賦予變量file
if [ -z "$file" ]
#判斷file變量是否為空
then
? echo "Error,please input a filename!"
? exit 1
elif [ ! -e "$file" ]
#判斷file的值是否存在
? then
? ? ? echo "Your input is not a file!"
? ? ? exit 2
elif [ -f "$file" ]
#判斷file的值是否是普通文件
? ? then
? ? ? echo "$file is a regulare file!"
elif [ -d "$file" ]
#判斷file的值是否是目錄文件
? ? then
? ? ? echo "$file is a directory!"
else
? ? echo "$file is an other file!"
fi
五毙玻、多分支case語句
1.case語句
case語句和if...elif...else語句一樣都是多分支條件語句,不過和if多分支條件語句不同的是廊散,case語句只能判斷一種條件關系桑滩,而if語句可以判斷多種條件關系。
例子 :??
#!/bin/bash
#判斷用戶輸入.-t 30:輸入的時間限制30s
read -p "Please choose yse/no: " -t 30 cho
case $cho in
? "yes")
? ? ? ? echo "Your choose is yes!"
? ? ? ;;
? "no")
? ? ? ? echo "Your choose is no!"
? ? ? ;;
? *)
? ? ? ? echo "Your choose is error!"
? ? ? ;;
esac
六允睹、for循環(huán)
1.for循環(huán)
例 子 一:
#!/bin/bash
#批量解壓縮腳本
cd /root/test
#輸出重定向寫入日志文件中
ls *.tar.gz > ls.log
#追加到日志文件施符,不覆蓋之前的
ls *.tgz >> ls.log
for i in $(cat ls.log)
? do
#&>/dev/null相當于回收站,不查看任何執(zhí)行信息
? ? tar -zxf $i & > /dev/null
? done
rm -rf /lamp/ls.log
2.例子:批量添加刪除指定數(shù)量的用戶
例子:
#!/bin/bash
#從1加到100
s=0
for (( i=1;i<=100;i++))
? do
? ? s=$(( $s + $i ))
done
echo "The sum of 1+2+3+...+100 is: $s "
七擂找、while和until循環(huán)
1.while和until循環(huán)
while循環(huán)是不定循環(huán),也稱作條件循環(huán)浩销。只要條件判斷式成立贯涎,循環(huán)就會一直繼續(xù),直到條件判斷式不成立慢洋,循環(huán)才會停止塘雳。不同于for的固定循環(huán)陆盘。
#!/bin/bash
#從1加到 100
i=1
s=0
while [ $i -le 100 ]
#如果變量i的值小于等于100,則執(zhí)行循環(huán)
? ? do
? ? ? s=$(( $s + $i ))
? ? ? i=$(( $i + 1 ))
? ? done
echo "The sum is: $s"
until循環(huán)败明,和while循環(huán)相反隘马,until循環(huán)時只要條件判斷式不成立則進行循環(huán),并執(zhí)行循環(huán)程序妻顶。一旦循環(huán)條件成立酸员,則終止循環(huán)。
例子:
#讳嘱!/bin/bash
#從1加到100
i=1
s=0
until [ $i -gt 100 ]
#循環(huán)直到變量i的值大于100幔嗦,就停止循環(huán)
do
? ? s=$(( $s + $i ))
? ? i=$(( $i + 1))
done
echo "The sum is : $s"
八、總結
1.shell主要用來簡化管理員的操作
2.shell編程更多的考慮程序功能的實現(xiàn)沥潭,而不是效率
: