shell腳本進階 詳解及其實例

来源:http://www.cnblogs.com/keerya/archive/2017/09/16/7530802.html
-Advertisement-
Play Games

shell腳本中的迴圈選擇語句用法詳解及實例。包括if、case、for、while、until、select、continue、break、shift、trap等。 ...


 

前言···· 2

一、條件選擇、判斷(ifcase···· 2

1.1 if語句用法及實例···· 2

1.2 case用法及實例···· 5

二、迴圈語句···· 7

2.1 for迴圈···· 8

2.2 while迴圈···· 10

2.3 until迴圈···· 12

2.4 select迴圈···· 13

2.5 迴圈小補充···· 14

2.5.1 迴圈控制語句 continue&break· 14

2.5.2 迴圈控制命令shift15

2.5.3 信號捕捉trap·· 16

2.5.4 創建無限迴圈···· 18

2.5.5 在迴圈語句中執行並行命令···· 18

三、小補充···· 20

1)列印等腰三角形(帶閃爍···· 20

2)列印國際象棋棋盤···· 21

 

 

 

 

前言

在我們使用linux的過程中,腳本可以給我們省很多時間和精力,比如,我們要定期備份一些文件,如果我們純手工去操作的話,每到一個時間段我們就要去進行備份的操作,如果某一次我們在乾其他事情的時候,把這件事情忘了那可怎麼辦╮(╯這個時候,我們就可以把需要執行的備份命令放在一個腳本裡面,通過一些語句去判斷是否符合我們執行命令的條件,實現自動化0.0這樣不就省時省心很多啦~老闆再也不用擔心我忘記備份ヽ()那麼,接下來,小編就來分享一下腳本的語法及實例。

一、條件選擇、判斷(ifcase

1.1 if語句用法及實例

當我們在腳本中遇到需要判斷的時候,我們就可以用if語句來實現。具體的語法如下:

  •    單分支

    if 判斷條件;then

    條件為真的分支代碼
  fi

  •    雙分支

if 判斷條件; then

條件為真的分支代碼

else

條件為假的分支代碼

fi

  •    多分支

if 判斷條件1; then

條件為真的分支代碼
elif
判斷條件2; then

條件為真的分支代碼
elif
判斷條件3; then

條件為真的分支代碼

else

以上條件都為假的分支代碼
fi

在多分支中,系統會逐條判斷你寫入的條件,第一次遇到條件時,執行該分支,而後結束整個if語句。

註意:1iffi是成對出現的

2if語句可以嵌套。

Example:

1)判斷兩個數字的大小

 1 #!/bin/bash
 2 #定義變數
 3 read -p "Please input the first num:" num1
 4 read -p "Please input the second num:" num2
 5 #判斷數字是否符合標準
 6 if [[ $num1 =~ ^[0-9]+$ && $num2 =~ ^[0-9]+$ ]];then
 7 #    判斷兩個數字的大小並輸出判斷結果
 8     if [ $num1 -lt $num2 ];then
 9         echo "The num2 is biger than the num1"
10     elif [ $num1 -eq $num2 ];then
11         echo "Two numbers equal"
12     else 
13         echo "The num1 is biger than the num2"
14     fi
15 else
16     echo "Please enter the correct number"
17 fi
18 
19 #刪除變數
20 unset num1 num2

 

 

2編寫腳本/root/bin/createuser.sh,實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶的id號等信息

 1 #!/bin/bash
 2 #定義變數
 3 read -p "請輸入一個用戶名:" name
 4 #判斷用戶名是否存在
 5 if  `id $name &> /dev/null`;then
 6 #    若存在,則輸出ID等信息
 7 echo "用戶存在,用戶的ID信息為:`id $name`"
 8 else
 9 #    若不存在,則添加用戶,設置密碼為隨機8位,下次登錄時提示修改密碼,同時顯示ID等信息
10 passwd=`cat /dev/urandom |tr -cd [:alpha:] |head -c8`
11 `useradd $name &> /dev/null`
12 `echo "$passwd" | passwd --stdin $name &> /dev/null`
13 echo "用戶名:$name 密碼: $passwd" >> user.txt
14 `chage -d 0 $name`
15 echo "用戶已添加,用戶的ID信息為:`id $name` 密碼為:$passwd"
16 fi
17 
18 #刪除變數
19 unset name passwd

 

 

1.2 case用法及實例

當涉及到多個條件匹配的時候,我們用if可能就很麻煩了,這個時候,我們就可以用case來編寫這個腳本。case的具體語法如下:

case 變數引用 in

PAT1)

分支1

;;

PAT2)

分支2

;;

...

*)

預設分支

;;

esac

註意:1case每一個分支後,都是以兩個“;”結尾的(最後一個可以省略)

      2caseesac是成對出現的

Example

1)編寫一個腳本,提示用戶輸入信息,判斷其輸入的是yesno或其他信息。

 1 #!/bin/bash
 2 #定義變數
 3 read -p "Yue ma?(yes or no):" ANS 
 4 #把變數中的大寫轉換為小寫
 5 ans=`echo "$ANS" |tr [[:upper:]] [[:lower:]] `
 6 #判斷輸入的信息是什麼並輸出結果
 7 case $ans in
 8 yes|y)
 9     echo "see you tonight"
10     ;;  
11 no|n)
12     echo "sorry,I have no time"
13     ;;  
14 *)
15     echo "what’s your means?"
16     ;;  
17 esac
18 
19 #刪除變數
20 unset ANS ans

 

 

2)編寫腳本/root/bin/filetype.sh,判斷用戶輸入文件路徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)

 1 #!/bin/bash
 2 read -p "請輸入一個文件路徑:" file
 3 #判斷文件是否存在
 4 `ls $file &> /dev/null`
 5 #若存在,判斷文件類型並輸出
 6 if [ $? -eq 0 ];then
 7     style=`ls -ld $file | head -c1`
 8     case $style in
 9     -)  
10         echo "這是一個普通文件"
11         ;;  
12     d)  
13         echo "這是一個目錄文件"
14         ;;  
15     l)  
16         echo "這是一個鏈接文件"
17         ;;
18     *)
19         echo "這是其他類型文件"
20         ;;
21     esac
22 #若不存在,提示並退出
23 else
24     echo "該文件不存在"
25     exit 2
26 fi
27 
28 #刪除變數
29 unset file style

 

 

二、迴圈語句

    在我們的腳本中,肯定也少不了對某一段代碼重覆運行多次的操作,此時,我們就會用到迴圈語句。迴圈語句中,都是有進入條件退出條件的,迴圈的次數也分為事先已知事先未知(事先已知就是我們知道迴圈的具體次數,事先未知則是指當滿足某一條件就進行迴圈,但是次數是不確定的。)。接下來,我們就來看看關於迴圈語句的用法。

2.1 for迴圈

for迴圈的執行機制是:一次將列表中的元素賦值給變數名;每次賦值後即執行一次迴圈體;直到列表中的元素耗盡,迴圈結束。基本的語法有兩種:

1for 變數名 in 列表 ; do

迴圈體

done

關於列表的生成方法,如下:

直接給出列表

整數列表:

a{start…end}

b`seq start end`

返回列表的命令

    $COMMAND

使用glob通配符如:

      *.sh

變數引用

$i$*

2for (( exp1; exp2; exp3 )); do

迴圈體

done

   更清晰的可以從下圖中看出:

 

Example:

1)列印九九乘法表

 1 #!/bin/bash
 2 #判斷i的值是否在1-9
 3 for i in {1..9};do
 4 #   判斷j的值是否在1-$i
 5 for j in `seq 1 $i`;do
 6 #       若在,則列印i*j的值
 7         echo -en "$i*$j = $[$i*$j]\t" 
 8     done
 9     echo
10 done
11 
12 #刪除變數
13 unset i j

 

 

2)輸入正整數n,計算1+…+n的和

 1 #!/bin/bash
 2 #定義變數
 3 sum=0
 4 read -p "請輸入一個正整數:" num 
 5 #判斷num是否是正整數
 6 if [[ $num =~ ^[[:digit:]]+$ ]];then
 7 #   若是,當i在1-$num時,輸出sum值
 8     for i in `seq 1 $num`;do
 9         let sum+=$i    
10     done 
11         echo "sum=$sum"
12 #若不是,提示輸出正整數
13 else 
14     echo "請輸入一個正整數!"
15 fi
16 
17 #刪除變數
18 unset i sum num

 

 

2.2 while迴圈

while迴圈比for迴圈略複雜一些,具體語法如下:

while CONDITION; do

      迴圈體

done

註意:1、進入條件:CONDITIONtrue;退出條件:CONDITIONfalse

      2CONDITION為迴圈控制條件:進入迴圈之前,先做一次判斷;每一次迴圈之後會再次做判斷;條件為“true”,則執行一次迴圈;知道條件測試狀態為“false”終止迴圈。

      3CONDITION一般應該有迴圈控制變數;此變數的值會在迴圈體不斷地被修正。

Example

1)計算100以內所有正奇數之和

 1 #!/bin/bash
 2 #定義變數
 3 i=1
 4 sum=0
 5 #當i<100時,執行下麵語句
 6 while [ $i -le 100 ];do
 7 #當i為奇數時,另sum=sum+I,i=i+1
 8     while [ $[i%2] -eq 1 ];do
 9         let sum+=$i
10         let i+=1 
11 done
12 #   當i不為奇數時,i=i+1
13     let i+=1
14 done
15 #輸出結果
16 echo "sum=$sum"
17 
18 #刪除變數
19 unset i sum

 

 

2.3 until迴圈

   until迴圈的語法和while的語法類似,但是進入和退出的條件卻剛好相反,所以不常用,只要我們瞭解即可。具體語法如下:

until CONDITION; do

   迴圈體

done

註意:1、進入條件:CONDITIONfalse;退出條件:CONDITIONtrue

     2dodone成對出現。

Example

1)迴圈輸出1-10

 1 #!/bin/bash
 2 #定義變數
 3 i=1
 4 #當i>10時,退出迴圈
 5 until [ $i -gt 10 ];do
 6 #   輸出i的值,i=i+1
 7     echo $i 
 8     let i+=1
 9 done
10 
11 #刪除變數
12 unset i 

 

2.4 select迴圈

   select迴圈主要用於創建菜單,按數字順序排列的菜單項將顯示在標準錯誤上,並顯示PS3提示符,等待用戶輸入。

   用戶輸入菜單列表中的某個數字,執行相應的命令。

   用戶輸入被保存在內置變數REPLY中。

   select的具體語法如下:

select variable in list; do

   迴圈體命令

done

註意:①select是個無線迴圈,因此要記住用break命令退出迴圈,或用exit命令終止腳本。也可以按ctrl+c退出迴圈。

②select經常和case聯合使用。

③與for迴圈類似,可以省略in list,此時使用位置變數。

Example

1)生成菜單,並顯示選中的價錢。

 1 #!/bin/bash
 2 #定義PS3提示符
 3 PS3="Please choose the menu:"
 4 #輸出菜單
 5 select menu in yangroutang mifan hulatang jiaozi lamian huimian quit
 6 do
 7 #   判斷選擇
 8     case $REPLY in
 9     1|4)
10         echo "The price is 20"
11         ;;  
12     2|5)
13         echo "The price is 12"
14         ;;  
15     3|6)
16         echo "The price is 10"
17         ;;  
18     7)  
19         break
20         ;;  
21     *)  
22         echo "Choose error"
23         ;;  
24     esac
25 done

 

2.5 迴圈小補充

2.5.1 迴圈控制語句 continue&break

   迴圈控制語句用於迴圈體中,常見的控制語句有兩種,continuebreak。接下來我們就來看看兩者的區別:

continue語句結束的是本輪迴圈,直接進入下一輪判斷;最內層是第1層。

break語句結束的則是整個迴圈,最內層為第1層。

Example

1)求(1+3+…+49+53+…+99)的和

 1 #定義變數
 2 sum=0
 3 for ((i=1;i<=100;i++));do
 4 #   當i為奇數時,繼續執行
 5     if [ $[i%2] -eq 1 ];then
 6 #       當i=51時,跳過該迴圈
 7         if [ $i -eq 51 ];then
 8             continue
 9         fi  
10         let sum+=$i
11     fi  
12 done
13 echo "sum=$sum"
14 
15 #刪除變數
16 unset i sum

 

2)求(1+3+…+49)的和

 1 #!/bin/bash
 2 #定義變數
 3 sum=0
 4 for ((i=1;i<=100;i++));do
 5 #   當i為奇數時,繼續執行
 6     if [ $[i%2] -eq 1 ];then
 7 #       當i=51時,跳出整個迴圈
 8         if [ $i -eq 51 ];then
 9             continue
10         fi  
11         let sum+=$i
12     fi  
13 done
14 echo "sum=$sum"
15 
16 #刪除變數
17 unset i sum

 

2.5.2 迴圈控制命令shift

   位置參數可以用shift命令左移,比如shift 3表示原來的$4現在變成$1,原來的$5現在變成$2等等,原來的$1$2$3丟棄,$0不移動。不帶參數的shift命令相當於shift 1

   我們知道,對於位置變數或命令行參數,其個數必須是確定的,或者當shell程式不知道其個數時可以把所有參數一起賦值給變數$*。當用戶要求shell在不知道位置變數個數的情況下,還能逐個的把參數一一進行處理,也就是在$1後為$2等。在shift命令執行前變數$1的值在shift命令執行後就不可用了。

Example:

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Sql Server 查看存儲過程最後修改時間 select * from sys.procedures order by modify_date desc ...
  • 問題:在存儲過程中使用臨時表時,不Create臨時表就會報錯。 分析了下,總結了臨時表創建方式的區別。 創建臨時表有兩種方法: 方法一 create table #臨時表名 ( 欄位1 約束條件, 欄位2 約束條件, …… ) create table ##臨時表名 ( 欄位1 約束條件, 欄位2 ...
  • 實現方式: 1、將欄位類型設為 TIMESTAMP 2、將預設值設為 CURRENT_TIMESTAMP 舉例應用: 1、MySQL 腳本實現用例 --添加CreateTime 設置預設時間 CURRENT_TIMESTAMP ALTER TABLE `table_name`ADD COLUMN ` ...
  • 1. CHAR 語法: CHAR (length) 其中length的取值範圍為1到255。 超過255則報錯: mysql> create table s3 ( value char(1023) primary key); ERROR 1074 (42000): Column length too ...
  • 技術棧數據流向平臺規模差異化,隔離化YARN: https://baike.baidu.com/item/yarn/16075826?fr=aladdin今天先到這兒,希望對您在系統架構設計與評估,團隊管理, 項目管理, 產品管理,團隊建設 有參考作用 , 您可能感興趣的文章: 互聯網電商購物車架構... ...
  • 1、簡介 crontab用於設置周期性被執行的命令 Linux系統中Linux調動工作分為兩大類: 1、系統執行的工作:系統周期性所要執行的工作,如備份系統數據、清理緩存 2、個人執行的工作:某個用戶定期要做的工作,例如每隔10分鐘檢查郵件伺服器是否有新信,這些工作可由每個用戶自行設置 /etc/c ...
  • 第1章 linux啟動過程 1、開機自檢bios 2、mbr引導 3、GRUB 菜單:選擇不同的內核 4、載入內核 5、運行init進程 6、讀取/etc/inittab運行級別配置文件 7、執行 /etc/rc.d/rc.sysinit 腳本 (系統的初始化腳本)配置主機名,IP地址 8、執行 / ...
  • 本次博客介紹了linux操作系統中常用的網路管理工具和相關配置文件。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...