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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...