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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux基础--Bash逻辑控制语句

發布時間:2023/12/20 linux 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux基础--Bash逻辑控制语句 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在邏輯控制語句中會使用各種運算符和測試判斷,可參見

http://iyull.blog.51cto.com/4664834/1884528


declare聲明變量

????declare -i sum=0:聲明sum為整形

????declare -x sum=0:聲明為環境變量,相當于export


linux隨機生成隨機數

/dev/random

/dev/urandom

使用方法:echo -n $RANDOM

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 生成10個隨機數,并求出最大值和最小值 #/bin/bash min=0 max=0 for?i?in?{1..10};do ??myran=$RANDOM ??[?$i?-eq?1?]?&&?min=$myran ??if?[?$i?-le?9?];then ?????echo?-n?"$myran," ??else ?????echo?"$myran" ??fi ??if??[?$myran?-gt?$max?];then ?????max=$myran ??fi ??if?[?$myran?-lt?$min?];then ?????min=$myran ??fi done echo?"max?is?$max" echo?"min?is?$min"



條件判斷if

單分支if語句

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 if?判斷條件;then ?stat3ment1 ?stat3ment2 ?... fi 雙分支if語句 if?判斷條件;then? ?stat3ment1 ?stat3ment2 ?... else ?stat3ment3 ?stat3ment4 ?... fi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 多分支/嵌套if語句 if?判斷條件;then? ?stat3ment1 ?... elif?判斷條件;then? ?stat3ment2 ?... elif?判斷條件;then? ?stat3ment3 ?... else ?statement4 ?... fi

注:if中判斷命令結果和狀態的說明

1 2 3 4 5 6 7 8 #不加反引號表明獲取命令執行狀態即$? if?ping?192.168.0.1?;then ???echo?"192.168.0.1?is?up" fi #加反引號表示獲取命令執行結果,在下面if中沒有實際意義。 if?`ping?192.168.0.1`;then ???... fi

迭代循環for

用于已知循環次數迭代使用

語法:

1 2 3 4 for?變量?in?列表 do ??循環體 done

列表生成方法:

1、{1..100}:1-100

2、seq 100:1-100

3、seq 2 2 100:起始數為2,步進為2,結束數為100

4、`ls /var`:通過命令替換生成列表


例:計算100以內所有能被3整除的數的和

1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash # sum=0 for?i?in?{1..100} do if?[?$[$i%3]?-eq?0?];then let?sum=$[$sum+$i] fi done echo?"$sum"


多重分支case

case結構用于多種情況的條件判斷。類似于其他編程語言中的switch/case語句,但從語法形式上講,有很大的不同。

語法:

1 2 3 4 5 6 7 8 9 10 11 case?字符串?in ????模式) ????????語句 ????????;; ????模式2|模式二??) ?????????語句 ?????????;; ????模式3) ?????????語句 ?????????;; esac

提示:esac就是case反過來寫。

示例:

根據用戶輸入,歸檔壓縮文件


while循環

語法:

1 2 3 4 5 while?CONDITION do ??statement ??... done

注:滿足CONDITTON開始循環,不滿足退出循環

示例:計算100以內的正整數的和

1 2 3 4 5 6 7 8 9 10 #!/bin/bash # sum=0 i=1 while?[?$i?-le?100?]? do ??let?sum+=$i ??let?i++ done echo?$sum

示例:每5秒鐘檢查一下user01是否登錄,如果登錄則退出

1 2 3 4 5 6 7 8 9 #!/bin/bash # user=`who?|grep?user01` while?[?-z?"$user"?];do ??echo?"user01?not?login" ??user=`who?|grep?user01` ??sleep?5 done echo?"user01?login"

示例:

顯示下面菜單給用戶

d|D) show disk usages

m|M) show memory usages

s|S) show swap usages

quit) quit script

當用戶選擇完成,顯示相應信息后,不退出,讓用戶再選擇一次,再次顯示相應內容,除非用戶使用quit

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #!/bin/bash # echo?"========d|D)?show?disk?usages========" echo?"========m|M)?show?memory?usages========" echo?"========s|S)?show?swap?usages========" echo?"========quit)?quit?script========" read?-p?"please?input?list:"?list while?[?"$list"?!=?'quit'?];do case?$list?in ??d|D) ????df?-Ph ??;; ??m|M) ????memuse=`free?-m?|grep?"buffers/cache"?|awk?'{print?$3}'` ????echo?"memory?usage?$memuse" ??;; ??s|S) ????swapuse=`free?-m?|grep?Swap?|awk?'{print?$2}'` ????echo?"swap?usages?$swapuse" ??;; ??*) ????echo?"Usage:please?input?d|D,m|M,s|S,quit?please?input?"quit"" ??;; ??quit) ????exit?0 ??;; esac read?-p?"please?input?list:"?list done


特殊用法一:

1 2 3 4 5 6 7 8 9 10 #死循環一 while?: do ??statement done #死循環二 while?true do ??statement done

特殊用法二:

1 2 3 4 5 6 #從文件中讀取內容并賦值給變量 while?read?LINE do ??statement done?<?/etc/passwd #從/etc/passwd中逐行取出內容并賦值給LINE變量。


邏輯判斷中特殊判斷

break:提前退出循環

continue:提前結束本輪循環,進入下一輪循環,一般是循環內設置條件,根據條件判斷是否continue


示例:計算100以內偶數的和,當和大于5000時不在計算。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 while循環實現 #!/bin/bash i=0 sum=0 while?[?$i?-lt?1000?];?do ??let?i++ ??if?[?$[$i%2]?-eq?0?];?then ????let?sum+=$i ????echo?$i ??fi ??if?[?$sum?-gt?5000?];?then ????break ??fi done echo?$sum
1 2 3 4 5 6 7 8 9 10 11 12 13 for循環實現 #!/bin/bash # sum=0 for?((i=0;i+=2;i<5000));do ??let?sum+=$i ??if?[?$sum?-gt?5000?];then ????break ??fi ??echo?$i done echo?$sum


until循環

語法:

1 2 3 4 5 until?CONDITION do ??statement ??... done

注:不滿足CONDITION開始循環,滿足結束循環


練習:通過ping測試10.82.10.0-10.82.10.10之間所有主機是否在線,在線則顯示“ip up”,不在線則顯示“ip down”。分別使用while、until、for(兩種形式)實現。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #while循環 #!/bin/bash # i=0 up=0 down=0 while?[?$i?-le?10?];do ??ping?-c?1?-W?1?10.82.10.$i?>/dev/null ??if?[?$??-eq?0?];then ????echo?-e?"\033[32m10.82.10.$i?is?up\033[0m" ????let?up++ ??else ????echo?-e?"\033[31m10.82.10.$i?is?down\033[0m" ????let?down++ ??fi let?i++ done echo?-e?"\033[32m10.82.10.XXX?up?ip?count?$up\033[0m" echo?-e?"\033[31m10.82.10.XXX?down?ip?count?$down\033[0m"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #until循環 #!/bin/bash # i=0 up=0 down=0 until?[?$i?-ge?10?];do ??ping?-c?1?-W?1?10.82.10.$i?>/dev/null ??if?[?$??-eq?0?];then ????echo?-e?"\033[32m10.82.10.$i?is?up\033[0m" ????let?up++ ??else ????echo?-e?"\033[31m10.82.10.$i?is?down\033[0m" ????let?down++ ??fi let?i++ done echo?-e?"\033[32m10.82.10.XXX?up?ip?count?$up\033[0m" echo?-e?"\033[31m10.82.10.XXX?down?ip?count?$down\033[0m"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #for循環1 #!/bin/bash # up=0 down=0 for?((i=0;i<10;i++));do ??ping?-c?1?-W?1?10.82.10.$i?>/dev/null ??if?[?$??-eq?0?];then ????echo?-e?"\033[32m10.82.10.$i?is?up\033[0m" ????let?up++ ??else ????echo?-e?"\033[31m10.82.10.$i?is?down\033[0m" ????let?down++ ??fi done echo?-e?"\033[32m10.82.10.XXX?up?ip?count?$up\033[0m" echo?-e?"\033[31m10.82.10.XXX?down?ip?count?$down\033[0m"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #for循環2 #!/bin/bash # up=0 down=0 for?i?in?{1..10};do ??ping?-c?1?-W?1?10.82.10.$i?>/dev/null ??if?[?$??-eq?0?];then ????echo?-e?"\033[32m10.82.10.$i?is?up\033[0m" ????let?up++ ??else ????echo?-e?"\033[31m10.82.10.$i?is?down\033[0m" ????let?down++ ??fi done echo?-e?"\033[32m10.82.10.XXX?up?ip?count?$up\033[0m" echo?-e?"\033[31m10.82.10.XXX?down?ip?count?$down\033[0m"


函數

結構化編程,不能獨立運行,需要調用時執行,可被多次調用

定義函數的兩種方式

1 2 3 4 5 6 7 8 #方式一 function?FUNCNAME?{ ??command } #方式二 FUNCNAME()?{ ??command }

1、引用函數執行結果并賦值

NAME=`FUNCNAME`

2、引用函數執行狀態,此方式只能獲取函數中最后一條命令的返回狀態。因此不可作為信任條件。

FUNCNAME

echo $?

3、自定義函數執行狀態

return #?? 定義函數返回狀態值,需注意,函數中執行到retrun就會結束函數。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #示例,自定義函數返回狀態值 #!/bin/bash # ADDUSER()?{ USERNAME=liangstudy if?!?id?=u?$USERNAME?&>?/dev/null;then ??useradd?$USERNAME?&>?/dev/null ??echo?$USERNAME?|passwd?--stdin?$USERNAME?&>?/dev/null ??return?0 else ??return?1 fi } ADDUSER if?[?$??-eq?0?];then ??echo?"add?user?finished" else ??echo?"add?user?failed" fi

4、函數參數

1 2 3 4 5 6 7 8 9 10 11 #計算1-10之間相鄰兩個數字的和 #!/bin/bash # twosum()?{ ??echo?$[$1+$2]???????#引用參數$1,$2 } for?i?in?{1..10};do ??let?j=$[$i+1] ??echo?"$i?plus?$j?is?`twosum?$i?$j`"???????#將函數結果引用并處理 done

示例:使用函數ping 192.168.1.1-30之間所有ip。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/bin/bash # Fping()?{ ping?-c?1?-W?1?192.168.1.$1?&>/dev/null if?[?$??-eq?0?];then ??echo?-e?"\033[32m192.168.210.$1?is?up\033[0m" else ??echo?-e?"\033[33m192.168.210.$1?is?down\033[0m" fi } for?i?in?{1..30};do ??Fping?$i done

示例:在主程序中,接收用戶輸入并傳遞給函數,判斷用戶是否存在,如果存在就返回UID和Shell,如果不存在,就提示并返回錯誤狀態值,判斷后不退出腳本,繼續提示輸入,輸入q或者Q退出

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #!/bin/bash # Fuser()?{ id?$1?&>?/dev/null if?[?$??-eq?0?];then ??UserUid=`grep?"$1"?/etc/passwd?|cut?-d:?-f3` ??UserShell=`grep?"$1"?/etc/passwd?|cut?-d:?-f7` ??echo?-e?"\033[32muser?$1?UID?is?$UserUid?and?Shell?is?$UserShell?\033[0m" ??return?0 else ??echo?-e?"\033[31muser?$1?is?not?exist?\033[0m" ??return?1 fi } read?-p?"please?input?user?name:"?UserName until?[?$UserName?==?q?-o?$UserName?==?Q?];do ??case?$UserName?in ????q|Q) ??????echo?"quit..." ??????exit?5 ??????;; ????*) ??????Fuser?$UserName ??????;; ???esac read?-p?"please?input?user?name:"?UserName done

本文轉自 ?亮公子 ?51CTO博客,原文鏈接:http://blog.51cto.com/iyull/1884546


總結

以上是生活随笔為你收集整理的linux基础--Bash逻辑控制语句的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。