Shell流程式控制制(if,else,case,while,for,until)

来源:http://www.cnblogs.com/argor/archive/2017/11/28/7908046.html
-Advertisement-
Play Games

1.條件選擇 1.1.if 語句 語法十分簡單 語句體,以fi結束。 利用選擇語句判斷變數獲取成功與否 1.2.case 語句 雙分號不能少;跟if一樣,語句體也需要結束符。 找工作時,根據應聘崗位不同,給出不同應徵者相應的聯繫人信息。 在輸出交互信息時,使用了echo命令。當要格式化輸出時,需要來 ...


1.條件選擇


1.1.if 語句

  語法十分簡單

#!/bin/bash

MATH_SCORES="$1"
NAME="$2"

if [ -z "${MATH_SCORES}" ]
then
  printf "The command requires that options have a scores.\n"
  printf "What's ths scores of your math? :"
  read MATH_SCORES
fi

if [ -z "${NAME}" ]
then
  printf "The command requires that options have a student's name.\n"
  printf "What's your name? :"
  read NAME
fi

if [ "${NAME}" = "sunny" ]
then
  printf "No, sunny is a teacher.\nPleae input your name,ok? "
  read NAME
  printf "My god,i think, you are bann sunny, excuse me.\n\n"
else
  printf "\n"
fi

if [ "${MATH_SCORES}" -ge 90 ]
then
  echo "Your scores is very good.Congratulations to you, ${NAME}."
  echo "I hope that you are't sunny."
else if [ "${MATH_SCORES}" -ge 60 ]
then
  echo "Congratulations. ${NAME}"
elif [ "${MATH_SCORES}" -ge 50 ]
then
  echo "Come on ${NAME}."
else
  echo "What are you interested in? Please tell me, maybe i can help you, "${NAME}" ?"
fi;fi

echo
[web@h p]$ ./if_then_else.sh 37
The command requires that options have a student's name.
What's your name? :sunny
No, sunny is a teacher.
Pleae input your name,ok? sunny
My god,i think, you are bann sunny, excuse me.

What are you interested in? Please tell me, maybe i can help you, sunny ?

  語句體,以fi結束。

 

  利用選擇語句判斷變數獲取成功與否

JAVA_PATH=`which java 2>/dev/null`
if [ "x$JAVA_PATH" != "x" ]; then
    JAVA_PATH=`dirname $JAVA_PATH 2>/dev/null`
    JRE_HOME=`dirname $JAVA_PATH 2>/dev/null`
fi

 

1.2.case 語句

  雙分號不能少;跟if一樣,語句體也需要結束符。

  找工作時,根據應聘崗位不同,給出不同應徵者相應的聯繫人信息。

#!/bin/bash

echo -e "\v\tRecruitment Announcement"
echo "Are you ready to apply for any job?"
echo "1 accounting"
echo "2 cashier"
echo "3 secretary"
echo -e "\vPlease enter a number to select the corresponding positions."

read NUM
case $NUM in
  1)
    printf "call mr wang. number is 1124\n"
    ;;
  2)
    printf "call miss li. number is 1233.\n"
    ;;
  3)
    printf "call miss ji. number is 1367.\n"
    ;;
  *)
    printf "If you want to make a lot of money, to be a seller. call 1498.\n"
    ;;
esac

 

  在輸出交互信息時,使用了echo命令。當要格式化輸出時,需要來回調試。這裡僅僅為了熟悉下case語句的語法,更好的方法在“cat”博文里重新實現。

   使用case語句,處理坐標移動的結果。

#!/bin/bash

echo $(date)
X1=0
Y1=0

echo "L - turn left"
echo "R - turn right"
echo "U - turn up"
echo "D - turn down"
read INS

case $INS in
  L)
    X1=$[${X1}-1]
    ;;
  R)
    X1=$[${X1}+1]
    ;;
  U)
    Y1=$[${Y1}+1]
    ;;
  D)
    Y1=$[${Y1}-1]
    ;;
  [[:lower:]])
    printf "Uppers, please.\n"
    ;;
  *)
    ;;
esac

echo "x = ${X1} y = ${Y1}"

 

  輸出腳本的幫助信息:

case "$1" in
    "")
        run_it
        ;;
    -r|--read)
        read_it
        ;;
    -v|--version)
        display_version
        ;;
    --clear)
        clear_TMPFILE
        ;;
    -h|--help)
        display_help
        ;;
    *)
        echo "findTom -h"
        display_help
        ;;
esac

如果“"-v|--version"”,以雙引號表示,會出現意外。要是想用,就該這麼寫:“"-v"|"--version"”。

 

1.3.通過輯判斷實現條件測試

[view@file donatello]$ [ 3 -gt 5 ] && echo "true " || echo "false "
false
[view@file donatello]$ [ ! 3 -gt 5 ] && echo "true " || echo "false "
true


[work@file donatello]$  [ ! 3 -gt 5 ] && ( echo -n "true, "; echo "exit 0" ) || ( echo -n "false, "; echo "exit 1" )
true, exit 0
[work@file donatello]$  [ 3 -gt 5 ] && ( echo -n "true, "; echo "exit 0" ) || ( echo -n "false, "; echo "exit 1" )
false, exit 1

 

2.迴圈


 

2.1.for迴圈

  語法格式:

for name[ [in [words…] ] ; ] do commands; done
for ((expr1;expr2;expr3)) ; do commands; done

 

[web@h p]$ ls >> java.dir
[web@h p]$ cat java.sh
#!/bin/bash
 
for i in $(cat java.dir)
do
  echo $i
done

 

計算1加到10

#!/bin/bash

declare -i sum=0
for i in {1..10}
do
        sum=$((sum+i))
done

echo sum = $sum

#!/bin/bash

sum=0
for i in $(seq 1 10)
do
        sum=$((sum+i))
done

echo sum = $sum

 

for 語句不帶列表,就從命令行獲取列表信息

[web@h p]$ cat t1.sh
#!/bin/bash
 
for i
do
  echo $i
done
[web@h p]$ sh t1.sh ls
ls
[web@h p]$ sh t1.sh `ls`

 

類C風格(體現在“for”語句中、以及迴圈體中;變數不需要“$”符號)

#!/bin/bash

SUM=0
MAX=100
MIN=0

for ((i=MIN; i<= MAX; i++))
do
  SUM=$[SUM+i]
done

echo "From ${MIN} add to ${MAX} is $SUM."

 

2.2.迴圈until、while

  條件判斷時如果涉及了命令的返回值,該值不管返回了0還是1之類,都需要跟數字比較來控製程序的運行。

#語法
until test-commands; do consequent-commands; done
while test-commands; do consequent-commands; done

 

  while迴圈是條件滿足時開始執行;until迴圈是條件不滿足時開始迴圈。

  舉個例子,條件為假時,才能執行迴圈體語句:

#!/bin/bash
until false
do
        echo -n '-'
        sleep 1
        echo -e -n '\b\'
        sleep 1
        echo -e -n '\b-'
        sleep 1
        echo -e -n '\b/'
        sleep 1
        echo -e -n '\b*'
done

 

  若是換作了條件滿足時執行迴圈體語句的情況,就可以選擇while語句。

  while還可以直接讀取文件,在done語句處“done < /path/to/file”。查看系統預設掛載的特殊文件系統:

#!/bin/bash
#

while read LINE; do
        echo $LINE | grep -v dev &> /dev/null
        if [ $? -eq 0 ]; then
                echo $LINE | awk '{print $1}' | grep -v boot
        fi
done < /etc/fstab

 


bash腳本調試

  檢查腳本語法、調試執行腳本

$ bash -n adduser.sh
$ bash -x adduser.sh

 

  shell腳本追蹤

  在測試腳本時,可以使用set命令進行運行時的追蹤。在腳本中加入一行“set -x”;以“+”開頭的行,就是獲得的追蹤內容(程式的執行過程)。

[root@right mag]# cat tes.sh 
#!/bin/bash

set -x
read -p "How old are you? " answer
if [ $answer == "34" ]; then
    echo "Yes, very good."
else
    echo "No, i don't want say anyting."
fi

exit 0
[root@right mag]# ./tes.sh 
+ read -p 'How old are you? ' answer
How old are you? 34
+ '[' 34 == 34 ']'
+ echo 'Yes, very good.'
Yes, very good.
+ exit 0
[root@right mag]# ./tes.sh 
+ read -p 'How old are you? ' answer
How old are you? 33
+ '[' 33 == 34 ']'
+ echo 'No, i don'\''t want say anyting.'
No, i don't want say anyting.
+ exit 0

 

  看看沒有追蹤的執行過程:

[root@right mag]# ./tes.sh 
How old are you? 32
No, i don't want say anyting.

 


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

-Advertisement-
Play Games
更多相關文章
  • (開頭閑淡)項目需要必須安裝SQL的,查了很久,斷斷續續用了各種方法,今天終於用了正確的姿(xia)勢(mo)弄成了。 最開始用的方法是調用Win的API模擬滑鼠操作安裝的,嗯,雖然勉強可以,就是有些狗屎。 大概可以放到GitHub 上丟人現眼了 今天搜資料庫創建的問題看到"無人值守安裝sql",才 ...
  • Redis 持久化之RDB和AOF Redis 有兩種持久化方案,RDB (Redis DataBase)和 AOF (Append Only File)。如果你想快速瞭解和使用RDB和AOF,可以直接跳到文章底部看總結。本章節通過配置文件,觸發快照的方式,恢複數據的操作,命令操作演示,優缺點來學習 ...
  • 首先聲明:未經本人同意,請勿轉載,謝謝! 本人使用自己編譯的開源版本的greenplum資料庫用於學習,版本為PostgreSQL 8.3.23 (Greenplum Database 4.3.99.00 build dev) on x86_64-unknown-linux-gnu, compile ...
  • 恢復內容開始 問題引起原因: 由於在執行大量插入操作的時候意外終止程式之後, MySQl的線程並沒有被終止,導致表不能打開和操作 - 解決思路就是找到等待的線程並kill -- 查看所有進程 1、SHOW PROCESSLIST; 2、找到卡死或在等待的線程,kill,假設這裡是49496卡死了 K ...
  • 1、NN宕掉切不過去先看zkfc的log引起原因是dfs.ha.fencing.ssh.private-key-files的配置路徑配錯造成以致無法找到公鑰 2、dfs.namenode.shared.edits.dir為JN啟動的所在地址,在部署時必須啟動對應伺服器的JN,否則無法完成NN的元信息 ...
  • axios的介紹就不用了吧,api有具體的介紹axios或者是axios中文; 主要講的就是我自己在第一次使用axios中遇到的問題,及二次封裝 先來說說二次封裝,之前自己也是網上找了很多同學的封裝,要麼就是把post和get請求分開的,要麼就是只大概寫了一種的或者只是吧API又複製粘貼了的,都不太 ...
  • 預設情況這些壓縮工具在壓縮後會刪除源文件(zip除外);而且預設只壓縮文件,而不壓縮目錄(鏈接到打包程式)。 gzip bzip2 zip GNU tar 1.gzip 1.gzip 1.1.壓縮 gzip 壓縮工具壓縮一個普通文件擴展名為“.gz”。壓縮後刪除了原文件。 可以一次壓縮多個文件。壓縮 ...
  • 虛擬主機需要備案嗎?我們在購買功能變數名稱空間的時候,有時會遇到虛擬主機備案的問題,有些虛擬主機需要備案,有些虛擬主機不需要備案,這就讓一些站長們困惑了。虛擬主機需要備案後才能訪問嗎? 網站備案是工信部要求的,主要是為了規範網路安全化,維護網站經營者的合法權益,保障網民的合法利益。凡是使用國內空間的網站功能變數名稱 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...