日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

shell编程之条件判断语句和流程控制语句

發(fā)布時(shí)間:2024/4/11 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell编程之条件判断语句和流程控制语句 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

shell條件判斷語(yǔ)句和流程控制語(yǔ)句

文章目錄

    • shell條件判斷語(yǔ)句和流程控制語(yǔ)句
    • 一、條件判斷語(yǔ)法結(jié)構(gòu)
    • 1. 條件判斷語(yǔ)法格式
    • 2. 條件判斷相關(guān)參數(shù)
    • 二、流程控制語(yǔ)句
    • 1. 基本語(yǔ)法結(jié)構(gòu)
    • 2. 應(yīng)用案例
    • 3. 練習(xí)

一、條件判斷語(yǔ)法結(jié)構(gòu)

思考:何為真(true)?何為假(false)?

1. 條件判斷語(yǔ)法格式

  • 格式1: test 條件表達(dá)式
  • 格式2: [ 條件表達(dá)式 ]
  • 格式3: [[ 條件表達(dá)式 ]] 支持正則 =~

特別說(shuō)明:

1)[ 親親,我兩邊都有空格,不空打死你呦 ] 👿
2)[[ 親親,我兩邊都有空格,不空打死你呦 ]]👿

  • 更多判斷, man test 去查看,很多的參數(shù)都用來(lái)進(jìn)行條件判斷
  • 2. 條件判斷相關(guān)參數(shù)

    問(wèn):你要判斷什么?
    答:我要判斷文件類型,判斷文件新舊,判斷字符串是否相等,判斷權(quán)限等等…

    ㈠ 判斷文件類型


    舉例說(shuō)明:

    test -e file 只要文件存在條件為真 [ -d /shell01/dir1 ] 判斷目錄是否存在,存在條件為真 [ ! -d /shell01/dir1 ] 判斷目錄是否存在,不存在條件為真 [[ -f /shell01/1.sh ]] 判斷文件是否存在,并且是一個(gè)普通的文件

    ㈡ 判斷文件權(quán)限


    ㈢ 判斷文件新舊
    說(shuō)明:這里的新舊指的是文件的修改時(shí)間


    ㈣ 判斷整數(shù)


    ㈤ 判斷字符串

    ㈥ 多重條件判斷

    特別說(shuō)明:

    • && 前面的表達(dá)式為真,才會(huì)執(zhí)行后面的代碼
    • || 前面的表達(dá)式為假,才會(huì)執(zhí)行后面的代碼
    • ; 只用于分割命令或表達(dá)式

    ① 舉例說(shuō)明

    • 數(shù)值比較
    [root@server ~]# [ $(id -u) -eq 0 ] && echo "the user is admin" [root@server ~]$ [ $(id -u) -ne 0 ] && echo "the user is not admin" [root@server ~]$ [ $(id -u) -eq 0 ] && echo "the user is admin" || echo "the user is not admin" [root@server ~]# uid=`id -u` [root@server ~]# test $uid -eq 0 && echo this is admin this is admin [root@server ~]# [ $(id -u) -ne 0 ] || echo this is admin this is admin [root@server ~]# [ $(id -u) -eq 0 ] && echo this is admin || echo this is not admin this is admin [root@server ~]# su - stu1 [stu1@server ~]$ [ $(id -u) -eq 0 ] && echo this is admin || echo this is not admin this is not admin
    • 類C風(fēng)格的數(shù)值比較
    注意:在(( ))中,=表示賦值;==表示判斷 [root@server ~]# ((1==2));echo $? [root@server ~]# ((1<2));echo $? [root@server ~]# ((2>=1));echo $? [root@server ~]# ((2!=1));echo $? [root@server ~]# ((`id -u`==0));echo $? [root@server ~]# ((a=123));echo $a [root@server ~]# unset a [root@server ~]# ((a==123));echo $?
    • 字符串比較
    注意:雙引號(hào)引起來(lái),看作一個(gè)整體;===[ 字符串 ] 比較中都表示判斷 [root@server ~]# a='hello world';b=world [root@server ~]# [ $a = $b ];echo $? [root@server ~]# [ "$a" = "$b" ];echo $? [root@server ~]# [ "$a" != "$b" ];echo $? [root@server ~]# [ "$a" !== "$b" ];echo $? 錯(cuò)誤 [root@server ~]# [ "$a" == "$b" ];echo $? [root@server ~]# test "$a" != "$b";echo $? test 表達(dá)式 [ 表達(dá)式 ] [[ 表達(dá)式 ]] 思考:[ ][[ ]] 有什么區(qū)別? [root@server ~]# a= [root@server ~]# test -z $a;echo $? [root@server ~]# a=hello [root@server ~]# test -z $a;echo $? [root@server ~]# test -n $a;echo $? [root@server ~]# test -n "$a";echo $? # [ '' = $a ];echo $? -bash: [: : unary operator expected 2 # [[ '' = $a ]];echo $? 0 [root@server ~]# [ 1 -eq 0 -a 1 -ne 0 ];echo $? [root@server ~]# [ 1 -eq 0 && 1 -ne 0 ];echo $? [root@server ~]# [[ 1 -eq 0 && 1 -ne 0 ]];echo $?

    ② 邏輯運(yùn)算符總結(jié)

  • 符號(hào);和&&和||都可以用來(lái)分割命令或者表達(dá)式
  • 分號(hào)(;)完全不考慮前面的語(yǔ)句是否正確執(zhí)行,都會(huì)執(zhí)行;號(hào)后面的內(nèi)容
  • && 符號(hào),需要考慮&&前面的語(yǔ)句的正確性,前面語(yǔ)句正確執(zhí)行才會(huì)執(zhí)行&&后的內(nèi)容;反之亦然
  • || 符號(hào),需要考慮||前面的語(yǔ)句的非正確性,前面語(yǔ)句執(zhí)行錯(cuò)誤才會(huì)執(zhí)行||后內(nèi)容;反之亦然
  • 如果&&和||一起出現(xiàn),從左往右依次看,按照以上原則
  • 二、流程控制語(yǔ)句

    1. 基本語(yǔ)法結(jié)構(gòu)

    ㈠ if結(jié)構(gòu)

    箴言1:只要正確,就要一直向前沖?

    • F:表示false,為假
    • T:表示true,為真
    if [ condition ];thencommandcommand fi if test 條件;then命令 fi if [[ 條件 ]];then命令 fi[ 條件 ] && command


    ㈡ if…else結(jié)構(gòu)
    箴言2:分叉路口,二選一

    if [ condition ];thencommand1 elsecommand2 fi [ 條件 ] && command1 || command2


    小試牛刀:
    讓用戶自己輸入字符串,如果用戶輸入的是hello,請(qǐng)打印world,否則打印“請(qǐng)輸入hello”

  • read定義變量
  • if…else…
  • 1. #!/bin/env bash read -p '請(qǐng)輸入一個(gè)字符串:' str if [ "$str" = 'hello' ];thenecho 'world' elseecho '請(qǐng)輸入hello!' fi 2. #!/bin/env bashread -p "請(qǐng)輸入一個(gè)字符串:" str if [ "$str" = "hello" ] thenecho worldelseecho "請(qǐng)輸入hello!"fi echo "該腳本需要傳遞參數(shù)"if [ $1 = hello ];thenecho "hello"elseecho "請(qǐng)輸入hello"fi3. #!/bin/env bash A=hello B=world C=hello if [ "$1" = "$A" ];thenecho "$B" elseecho "$C" fi read -p '請(qǐng)輸入一個(gè)字符串:' str; [ "$str" = 'hello' ] && echo 'world' || echo '請(qǐng)輸入hello!'

    ㈢ if…elif…else結(jié)構(gòu)
    箴言3:選擇很多,能走的只有一條

    if [ condition1 ];thencommand1 結(jié)束 elif [ condition2 ];thencommand2 結(jié)束 elsecommand3 fi 注釋: 如果條件1滿足,執(zhí)行命令1后結(jié)束;如果條件1不滿足,再看條件2,如果條件2滿足執(zhí)行命令2后結(jié)束;如果條件1和條件2都 不滿足執(zhí)行命令3結(jié)束.


    ㈣ 層層嵌套結(jié)構(gòu)
    箴言4:多次判斷,帶你走出人生迷霧

    if [ condition1 ];thencommand1if [ condition2 ];thencommand2fielseif [ condition3 ];thencommand3elif [ condition4 ];thencommand4elsecommand5fi fi 注釋: 如果條件1滿足,執(zhí)行命令1;如果條件2也滿足執(zhí)行命令2,如果不滿足就只執(zhí)行命令1結(jié)束; 如果條件1不滿足,不看條件2;直接看條件3,如果條件3滿足執(zhí)行命令3; 如果不滿足則看條件4,如果條件4滿足執(zhí)行命令4;否則執(zhí)行命令5

    2. 應(yīng)用案例

    ㈠ 判斷兩臺(tái)主機(jī)是否ping通

    需求:判斷當(dāng)前主機(jī)是否和遠(yuǎn)程主機(jī)是否ping通
    ① 思路

  • 使用哪個(gè)命令實(shí)現(xiàn) ping -c次數(shù)
  • 根據(jù)命令的執(zhí)行結(jié)果狀態(tài)來(lái)判斷是否通 $?
  • 根據(jù)邏輯和語(yǔ)法結(jié)構(gòu)來(lái)編寫腳本(條件判斷或者流程控制)
    ② 落地實(shí)現(xiàn)
  • #!/bin/env bash # 該腳本用于判斷當(dāng)前主機(jī)是否和遠(yuǎn)程指定主機(jī)互通 # 交互式定義變量,讓用戶自己決定ping哪個(gè)主機(jī) read -p "請(qǐng)輸入你要ping的主機(jī)的IP:" ip # 使用ping程序判斷主機(jī)是否互通 ping -c1 $ip &>/dev/null if [ $? -eq 0 ];thenecho "當(dāng)前主機(jī)和遠(yuǎn)程主機(jī)$ip是互通的" elseecho "當(dāng)前主機(jī)和遠(yuǎn)程主機(jī)$ip不通的" fi 邏輯運(yùn)算符 test $? -eq 0 && echo "當(dāng)前主機(jī)和遠(yuǎn)程主機(jī)$ip是互通的" || echo "當(dāng)前主機(jī)和遠(yuǎn)程主機(jī)$ip不通的"

    ㈡ 判斷一個(gè)進(jìn)程是否存在
    需求:判斷web服務(wù)器中httpd進(jìn)程是否存在
    ① 思路

  • 查看進(jìn)程的相關(guān)命令 ps pgrep
  • 根據(jù)命令的返回狀態(tài)值來(lái)判斷進(jìn)程是否存在
  • 根據(jù)邏輯用腳本語(yǔ)言實(shí)現(xiàn)
    ② 落地實(shí)現(xiàn)
  • #!/bin/env bash # 判斷一個(gè)程序(httpd)的進(jìn)程是否存在 pgrep httpd &>/dev/null if [ $? -ne 0 ];thenecho "當(dāng)前httpd進(jìn)程不存在" elseecho "當(dāng)前httpd進(jìn)程存在" fi 或者 test $? -eq 0 && echo "當(dāng)前httpd進(jìn)程存在" || echo "當(dāng)前httpd進(jìn)程不存在"

    ③ 補(bǔ)充命令

    pgrep命令:以名稱為依據(jù)從運(yùn)行進(jìn)程隊(duì)列中查找進(jìn)程,并顯示查找到的進(jìn)程id 選項(xiàng) -o:僅顯示找到的最小(起始)進(jìn)程號(hào); -n:僅顯示找到的最大(結(jié)束)進(jìn)程號(hào); -l:顯示進(jìn)程名稱; -P:指定父進(jìn)程號(hào);pgrep -p 4764 查看父進(jìn)程下的子進(jìn)程id -g:指定進(jìn)程組; -t:指定開(kāi)啟進(jìn)程的終端; -u:指定進(jìn)程的有效用戶ID。

    ㈢ 判斷一個(gè)服務(wù)是否正常
    需求:判斷門戶網(wǎng)站是否能夠正常訪問(wèn)
    ① 思路

  • 可以判斷進(jìn)程是否存在,用/etc/init.d/httpd status判斷狀態(tài)等方法
  • 最好的方法是直接去訪問(wèn)一下,通過(guò)訪問(wèn)成功和失敗的返回值來(lái)判斷
    • Linux環(huán)境,wget curl elinks -dump

    ② 落地實(shí)現(xiàn)

    #!/bin/env bash # 判斷門戶網(wǎng)站是否能夠正常提供服務(wù) #定義變量 web_server=www.itcast.cn #訪問(wèn)網(wǎng)站 wget -P /shell/ $web_server &>/dev/null [ $? -eq 0 ] && echo "當(dāng)前網(wǎng)站服務(wù)是ok" && rm -f /shell/index.* || echo "當(dāng)前網(wǎng)站服務(wù)不ok,請(qǐng)立刻 處理"

    3. 練習(xí)

    ㈠ 判斷用戶是否存在
    需求1:輸入一個(gè)用戶,用腳本判斷該用戶是否存在

    #!/bin/env bash read -p "請(qǐng)輸入一個(gè)用戶名:" user_name id $user_name &>/dev/null if [ $? -eq 0 ];thenecho "該用戶存在!" elseecho "用戶不存在!" fi#!/bin/bash # 判斷 用戶(id) 是否存在 read -p "輸入壹個(gè)用戶:" id id $id &> /dev/null if [ $? -eq 0 ];thenecho "該用戶存在" elseecho "該用戶不存在" fi#!/bin/env bash read -p "請(qǐng)輸入你要查詢的用戶名:" username grep -w $username /etc/passwd &>/dev/null if [ $? -eq 0 ] thenecho "該用戶已存在" elseecho "該用戶不存在" fi#!/bin/bash read -p "請(qǐng)輸入你要檢查的用戶名:" name id $name &>/dev/null if [ $? -eq 0 ] thenecho 用戶"$name"已經(jīng)存在 elseecho 用戶"$name"不存在 fi#!/bin/env bash #判斷用戶是否存在 read -p "請(qǐng)寫出用戶名" id id $id if [ $? -eq 0 ];thenecho "用戶存在" elseecho "用戶不存在" fi#!/bin/env bash read -p '請(qǐng)輸入用戶名:' username id $username &>/dev/null [ $? -eq 0 ] && echo '用戶存在' || echo '不存在'

    ㈡判斷當(dāng)前主機(jī)的內(nèi)核版本

    需求3:判斷當(dāng)前內(nèi)核主版本是否為2,且次版本是否大于等于6;如果都滿足則輸出當(dāng)前內(nèi)核版本

    思路: 1. 先查看內(nèi)核的版本號(hào) uname -r 2. 先將內(nèi)核的版本號(hào)保存到一個(gè)變量里,然后再根據(jù)需求截取出該變量的一部分:主版本和次版本 3. 根據(jù)需求進(jìn)步判斷 #!/bin/bash kernel=`uname -r` var1=`echo $kernel|cut -d. -f1` var2=`echo $kernel|cut -d. -f2` test $var1 -eq 2 -a $var2 -ge 6 && echo $kernel || echo "當(dāng)前內(nèi)核版本不符合要求" 或者 [ $var1 -eq 2 -a $var2 -ge 6 ] && echo $kernel || echo "當(dāng)前內(nèi)核版本不符合要求" 或者 [[ $var1 -eq 2 && $var2 -ge 6 ]] && echo $kernel || echo "當(dāng)前內(nèi)核版本不符合要求"或者 #!/bin/bash kernel=`uname -r` test ${kernel:0:1} -eq 2 -a ${kernel:2:1} -ge 6 && echo $kernel || echo '不符合要求' 其他命令參考: uname -r|grep ^2.[6-9] || echo '不符合要求'

    總結(jié)

    以上是生活随笔為你收集整理的shell编程之条件判断语句和流程控制语句的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。