linux shell script程式之選擇結構簡介
很多人都是先學習C/C++語言, 然後再學習shell script的。 如果大家有一點點程式設計基礎, 那麼就很容易理解所謂的順序、選擇和迴圈。順序結構其實沒什麼好說的, 之前早就接觸過了, 在本文中, 我們來介紹一下選擇結構。 雖然簡單, 但還是要熟練正確地使用, 畢竟和C/C++的語法還是有一些出入的。 一不小心, 就容易出錯。
1. 先看個入門級別的:
[[email protected] learn_shell]$ cat a.sh
#! /bin/bash
echo "enter your bank password"
read passwd
if [ $passwd = "3.1415" ]; then
echo yes
else
echo no
fi
[ [email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$ ./a.sh
enter your bank password
1
no
[[email protected] learn_shell]$ ./a.sh
enter your bank password
3.1415
yes
[[email protected] learn_shell]$ ./a.sh
enter your bank password
12 34
./a.sh: line 5: [: too many arguments
no
[ [email protected] learn_shell]$
上面的程式, 有如下幾點值得注意:
(1) $passwd兩邊最好加上引號, 免得使用者輸入12 34的時候, 出現 12 34 = "3.1415"這樣的錯誤。
(2) if後面必須有空格, 好惡心的規定啊。
(3) [ ]裡面該加空格的地方一定要加, 否則會有錯誤。
(4) 如果then和if處在同一行, 那麼then前面的那個分號絕對不能少。 當然, then可以放到下面獨立成行
(5) 在比較相等的時候, 最好用==, 而不是=, 儘管後者也可以, 但是會讓很多c/c++程式猿感覺難以適應, 感覺不舒服。
下面, 我來改一下, 使得上面程式更好:
[[email protected] learn_shell]$ cat a.sh
#! /bin/bash
echo "enter your bank password"
read passwd
if [ "$passwd" == "3.1415" ] # pay special attention to this line, my friends!
then
echo yes
else
echo no
fi
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$ ./a.sh
enter your bank password
1
no
[[email protected] learn_shell]$ ./a.sh
enter your bank password
3.1415
yes
[[email protected] learn_shell]$ ./a.sh
enter your bank password
12 34
no
[[email protected] learn_shell]$
和C/C++一樣, linux shell script也會進行短路求值, 如下(我認為這個程式非常精妙):
[[email protected] learn_shell]$ cat a.sh
#! /bin/bash
#! /bin/bash
echo "enter your bank password"
read passwd
[ "$passwd" == "3.1415" ] && echo yes
[ "$passwd" == "3.1415" ] || echo no
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$ ./a.sh
enter your bank password
3.1415
yes
[[email protected] learn_shell]$ ./a.sh
enter your bank password
3
no
[[email protected] learn_shell]$
2. 看個稍微複雜一點點的, 其實也很簡單:
[[email protected] learn_shell]$ cat a.sh
#! /bin/bash
echo "enter your login password"
read passwd
if [ "$passwd" == "yaoming" ]
then
echo "hello yaoming, you are so tall"
elif [ "$passwd" == liuxiang ]
then
echo "hello liuxiang, you are so fast"
elif [ "$passwd" == wangliqin ]
then
echo "hello wangliqin, you play pingpong so well"
else
#no then in this line
echo "you do not belong here"
fi
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$ ./a.sh
enter your login password
yaoming
hello yaoming, you are so tall
[[email protected] learn_shell]$ ./a.sh
enter your login password
liuxiang
hello liuxiang, you are so fast
[[email protected] learn_shell]$ ./a.sh
enter your login password
wangliqin
hello wangliqin, you play pingpong so well
[[email protected] learn_shell]$ ./a.sh
enter your login password
zhangyining
you do not belong here
[[email protected] learn_shell]$
3. 再看case:
[[email protected] learn_shell]$ cat a.sh
#! /bin/bash
echo "enter your login password"
read passwd
case "$passwd" in
"yaoming")
echo "hello yaoming, you are so tall"
;;
"liuxiang")
echo "hello liuxiang, you are so fast"
;;
"wangliqin")
echo "hello wangliqin, you play pingpong so well"
;;
*)
echo "you do not belong here"
;;
esac
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$ ./a.sh
enter your login password
yaoming
hello yaoming, you are so tall
[[email protected] learn_shell]$ ./a.sh
enter your login password
liuxiang
hello liuxiang, you are so fast
[[email protected]calhost learn_shell]$ ./a.sh
enter your login password
wangliqin
hello wangliqin, you play pingpong so well
[[email protected] learn_shell]$ ./a.sh
enter your login password
zhangyining
you do not belong here
[[email protected] learn_shell]$
需要注意: ;;就類似於C/C++語言中的break, 只不過, 在此處絕不可少, 否則執行shell的時候, 會出問題。
另外, 最後的*)位置相當重要, 必須放在最後, 因為linux shell script中的case是逐條前後逐條匹配的, 而C/C++中的default放置的位置則沒有限制, 放在最開始的位置也沒有任何關係。
下面,我們來一起驗證一下, *)放在前面會導致邏輯錯誤, 如下:
[[email protected] learn_shell]$ cat a.sh
#! /bin/bash
echo "enter your login password"
read passwd
case "$passwd" in
*)
echo "you do not belong here"
;;
"yaoming")
echo "hello yaoming, you are so tall"
;;
"liuxiang")
echo "hello liuxiang, you are so fast"
;;
"wangliqin")
echo "hello wangliqin, you play pingpong so well"
;;
esac
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$ ./a.sh
enter your login password
yaoming
you do not belong here
[[email protected] learn_shell]$
4. test命令和[ ]命令
先說明一下, test命令完全等價於[ ]命令, 可以任選其一, 當然, 每個人有不同的愛好, 我個人就比較喜歡[ ]命令, 下面, 我們來一起看一下:
[[email protected] learn_shell]$ cat a.sh
#! /bin/bash
echo "enter your login password"
read passwd
if test "$passwd" == "linux" ; then
echo yes
else
echo no
fi
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$ ./a.sh
enter your login password
linux
yes
[[email protected] learn_shell]$ ./a.sh
enter your login password
LINUX
no
[[email protected] learn_shell]$
我看著test就感覺挺彆扭的, 還是用[ ]吧。在用[ ]的時候一定要注意: [後面如果沒有空格, 那將是語法錯誤, 但是, 如果 ==左右沒有空格, 那就是致命的邏輯錯誤, 此時if會永遠為真, 千千萬萬要注意啊。 linux shell script就是這樣, 到處都是蛇, 小心它咬你。
最後, 我們以一個稍微複雜一點的程式來結束本文:
[[email protected] learn_shell]$ cat a.sh
#! /bin/bash
# compare string
name=""
if [ "$name" == "" ]; then
echo log1
else
echo log2
fi
if [ -z "$name" ]; then
echo log3
else
echo log4
fi
name="taoge"
if [ -z "$name" ]; then
echo log5
else
echo log6
fi
if [ -n "$name" ]; then
echo log7
else
echo log8
fi
if [ "$name" == "taoge" ]; then
echo log9
else
echo log10
fi
# compare number
if [ "$#" -eq 0 ]; then
echo log11
else
echo log12
fi
if [ "$#" -lt 1 ]; then
echo log13
else
echo log14
fi
if [ 1 -lt 2 -a 2 -lt 3 ]; then
echo log15
else
echo log16
fi
if [ 1 -lt 2 ] && [ 2 -lt 3 ]; then
echo log17
else
echo log18
fi
# test directory or file
pwd
if [ -e /home/taoge/Desktop/learn_shell ]; then
echo log19
else
echo log20
fi
if [ -e /home/taoge/Desktop/learn_shell/test.html ]; then
echo log21
else
echo log22
fi
touch /home/taoge/Desktop/learn_shell/test.html
if [ -e /home/taoge/Desktop/learn_shell/test.html ]; then
echo log23
else
echo log24
fi
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$
[[email protected] learn_shell]$ ./a.sh
log1
log3
log6
log7
log9
log11
log13
log15
log17
/home/taoge/Desktop/learn_shell
log19
log22
log23
[[email protected] learn_shell]$
好吧, 先說到這裡。
相關推薦
linux shell script程式之選擇結構簡介
很多人都是先學習C/C++語言, 然後再學習shell script的。 如果大家有一點點程式設計基礎, 那麼就很容易理解所謂的順序、選擇和迴圈。順序結構其實沒什麼好說的, 之前早就接觸過了, 在本文中, 我們來介紹一下選擇結構。 雖然簡單, 但還是要熟練正
linux shell script中的函式簡介
懂C語言的人, 沒有不知道函式的, 下面我們來看看linux shell script中的函式, 其實也很簡單: [[email protected] learn_shell]$ ls a.sh [[email protected] l
c語言學習之選擇結構程序設計(第三天)
c語言 選擇結構為了增加理解,寫的幾個小程序1:判斷三角形的成立以及輸出最大邊 練習前三種語句#include <stdio.h> int main() { int a,b,c; printf("請輸入三角形三邊長(邊為整數,不能輸入負數):"); scanf("%d%d%d", &a ,
Linux Shell編程之基本概念
Linux Shell編程的簡單操作Shell編程其實就是以bash的為基礎,將多個命令組合起來的程序。嚴重註意$hostname與$(hostname)之間的區別$hostname是取hostname變量的值$(hostname)是取hostname命令的執行結果Shell的基本格式第一行:#!/bin/b
Linux Shell編程之算術運算
Linux Shell編程的簡單操作+ 加- 減* 乘/ 除** 次方% 取余這些運算符號在一些場景下,需要轉義。比如說在通配符的場景下運算必須是兩個括號或者一個中括號let 運算後不顯示結果 而且需要一個變量來保存計算結果常規的運算符號不好使如果不想使用let 可以使用兩個括號 或者一個中括號expr
Linux Shell編程之測試條件
Linux Shell編程的簡單操作執行命令並利用命令狀態返回值來判斷某些狀態echo $? 0代表成功,非0代表不成功測試表達式數值比較-eq 等於返回值是1,說明2不等於3-ne 不等於返回值是0 說明2不等於3還可以直接使用中括號,而不需要輸入test關鍵字返回值為1 說明2等於2-gt 左側是否大於右
Linux Shell編程之特殊變量
Linux Bash編程的簡單操作$0 這個是腳本文件的路徑本身(相對路徑)如果當前目錄下有執行腳本文件,就不能寫絕對路徑進行執行。$# 這個變量用來記錄輸入參數的個數6就是本次執行命令時輸入的參數個數。$* 這個變量記住了所有輸入的參數$@ 這個變量也記住了所有輸入的參數那麽$@ 和$* 有什麽區別的?$@
Linux Shell腳本之向腳本傳遞參數
Linux Shell編程的簡單操作在之前的命令中 ls /var 那麽在這個命令中ls是命令關鍵字,/var就是參數。那麽我們自己在編Shell腳本的時候如何進行參數傳遞呢?在bash中,系統會自動將第一個參數放入$1中,第二個參數放在$2中,依次類推。如果參數的數量到了兩位數,那麽引用的參數就變成$(10
linux——shell編程之函數和循環控制
read nbsp 進入 var 失敗 tin col img 命令執行 函數:實現獨立功能的代碼段 函數只有在調用時才會執行 語法一: function F_NAME{ 函數體 } 語法二: F_NAME() {
linux—shell編程之數組和字符串處理工具
arr 跳過 set 一個 一個空格 png 取字符串 read alt 數組:存放多個元素的連續內存空間。 聲明數組:bash-4以後支持除默認的0,1,2……還可以自定義索引格式,此類數組稱之為“關聯數組” 聲明索引數組:declare -a NAME
《資料結構與演算法》之資料結構簡介
資料結構=資料+結構,資料結構是計算機儲存、組織資料的方式。資料結構是指相互之間存在一種或多種特定關係的資料元素的集合。通常情況下,精心選擇的資料結構可以帶來更高的執行或者儲存效率。資料結構往往同高效的檢索演算法和索引技術有關。 一、資料的邏輯結構:指反映資料元素之間的邏輯關係的資料結構,其中的
Java Swing使用者介面元件之選擇元件簡介(未完待續)
對使用者介面進行設計時,很多情況下都需要給使用者以選項做出選擇。因此常常會用到選擇元件,其中包括:複選框元件(JCheckBox)、單選框元件(JRadioButton)等。本篇文章主要介紹了Java Swing元件複選框JCheckBox用法,結合具體例項形
從新手到系統管理員(四):Linux Shell指令碼程式設計之數學(Part I)
本文由 [茶話匯] – [Qing] 編譯自 [Avishek Kumar] 轉載請註明出處 這部分主要討論數學相關的shell指令碼程式設計。 加法運算 新建一個檔案“Addition.sh”,輸入下面的內容並賦予其可執行的許可權。 [code language=”bash”] #!/bin/b
Linux的基本操作及系統結構簡介
一.虛擬機器控制命令 如圖所示: rht-vmctl start desktop ##開啟虛擬機器 rht-vmctl view desktop ##顯示虛擬機器 rht-vmctl poweroff desktop ##關閉虛擬機器 rht-vmctl reset desktop ##重
《Linux Shell》筆記之正則表示式
正則表示式概念 正則表示式的文法分為3種標準:BRE、ERE 和 ARE。其中 BER 和 ERE 屬於 POSIX 標準,ARE 則是由各家定義的擴充套件 BRE:基本正則表示式 ERE:在BRE基礎上,擴充套件正則表示式 什麼是POSIX呢,POSIX Portable Operating Syste
linux shell script總結
在一些linux系統管理和自動化測試中經常需要寫一些shell指令碼,所以這裡總結一下主要的規則,便於以後編寫時查閱。 shell的開頭必須以 #!/bin/bash開頭,表明是使用/bin/bash來解釋指令碼的執行。 shell的註釋用# 可以使用so
linux shell script 進階篇(1)--如何打造功能強大的函式?
函式不管在那個程式語言中都有舉足輕重的地位,在linux shell script中當然也不例外,下面我們就一起學習如何打造出功能強大的函式。 1.如何在script中建立一個函式,可以用以下兩種方式: A. function name { commands } B.
linux-shell指令碼命令之awk
[ awk用法示例: ] 1. -F 表示以什麼作為分隔符 awk -F: '{print $1}' ccc.txt # 以 : 作為分隔符, 打印出ccc.txt檔案中每一行中的第一段字串 awk -F: '{print $1,$2}' cc
Linux shell指令碼程式設計之函式
在編寫功能比較複雜的shell指令碼時,完成具體任務的程式碼有時會被重複使用,bash shell指令碼提供函式特性實現程式碼複用,函式是被賦予名稱的指令碼程式碼塊。 一、建立函式 在bash shell指令碼中建立函式的格式如下: function name() {
Linux shell script 的 關閉echo -e 在shell指令碼中輸出 “-e”
第一次寫 script指令碼 按照鳥哥的hello world 的程式寫了一下: #!/bin/bash # Program: # This program shows "hello World!" in your screen. #History: # 2015/07/1