Shell編程之條件判斷與流程控制

一、條件判斷式語句

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ù)之間的比較


整數(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語句

單分支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.判斷輸入的是否有誤


雙分支if語句

例子:注意:記得給此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權限

判斷apache是否啟動

四挟裂、多分支if語句

1.語句簡介


多分支If語句

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語句可以判斷多種條件關系。


case語法

例子 :??

#!/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)


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ù)量的用戶


for循環(huán)語法二

例子:

#!/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 "


批量添加指定數(shù)量用戶例子


批量刪除普通用戶

七擂找、while和until循環(huán)

1.while和until循環(huán)

while循環(huán)是不定循環(huán),也稱作條件循環(huán)浩销。只要條件判斷式成立贯涎,循環(huán)就會一直繼續(xù),直到條件判斷式不成立慢洋,循環(huán)才會停止塘雳。不同于for的固定循環(huán)陆盘。


while語法結構

#!/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)。


until循環(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)沥潭,而不是效率



:

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末邀泉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子钝鸽,更是在濱河造成了極大的恐慌汇恤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拔恰,死亡現(xiàn)場離奇詭異因谎,居然都是意外死亡,警方通過查閱死者的電腦和手機仁连,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門蓝角,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饭冬,你說我怎么就攤上這事使鹅。” “怎么了昌抠?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵患朱,是天一觀的道長。 經(jīng)常有香客問我炊苫,道長裁厅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任侨艾,我火速辦了婚禮执虹,結果婚禮上,老公的妹妹穿的比我還像新娘唠梨。我一直安慰自己袋励,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茬故,像睡著了一般盖灸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上磺芭,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天赁炎,我揣著相機與錄音,去河邊找鬼钾腺。 笑死徙垫,一個胖子當著我的面吹牛,可吹牛的內容都是我干的垮庐。 我是一名探鬼主播松邪,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哨查!你這毒婦竟也來了逗抑?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤寒亥,失蹤者是張志新(化名)和其女友劉穎邮府,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溉奕,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡褂傀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了加勤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仙辟。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鳄梅,靈堂內的尸體忽然破棺而出叠国,到底是詐尸還是另有隱情,我是刑警寧澤戴尸,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布粟焊,位于F島的核電站,受9級特大地震影響孙蒙,放射性物質發(fā)生泄漏项棠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一挎峦、第九天 我趴在偏房一處隱蔽的房頂上張望香追。 院中可真熱鬧,春花似錦坦胶、人聲如沸翅阵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掷匠。三九已至,卻和暖如春岖圈,著一層夾襖步出監(jiān)牢的瞬間讹语,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工蜂科, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留顽决,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓导匣,卻偏偏與公主長得像才菠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贡定,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容