Shell基本語法

腳本Demo:Github地址

1、條件測試:test [
命令test或[可以測試一個條件是否成立;一個指令的執行成功與否,可以使用$?變量來觀察;
例:

(1)命令test:Exit Status為0

?  ~ var=2
?  ~ test $var -gt 1
?  ~ echo $?
0

(2)命令test:Exit Status為1

?  ~ test $var -gt 3
?  ~ echo $?
1

(3)[方式:語法格式錯誤(空格)

?  ~ [$var -gt 3]
zsh: bad pattern: [2

(4)[方式:Exit Status為1

?  ~ [ $var -gt 3 ]
?  ~ echo $?
1

備注:由此可以看出左方括號[確實是一個命令的名字,傳給命令的各參數之間應該用空格隔開,比如,$VAR、-gt、3、]是[命令的四個參數,它們之間必須用空格隔開。命令test或[的參數形式是相同的,只不過test命令不需要]參數。

判斷語句 意義
[ -d DIR ] DIR是否存在并且是一個目錄
[ -e FILE ] FILE是否存在
[ -f FILE ] FILE是否存在并且是一個普通文檔
[ -r FILE ] FILE是否具有可讀權限
[ -w FILE ] FILE是否具有可寫權限
[ -s FILE ] FILE是否存在并且為非空文檔
[ FILE1 -nt FILE2 ] FILE1是否比FILE2新
[ FILE1 -ot FILE2 ] FILE1是否比FILE2舊
[ -z STRING ] STRING長度是否為0
[ -n STRING ] STRING長度是否非0
[ STRING1 = STRING2 ] 兩個字符串長度是否相等
[ STRING1 != STRING2 ] 兩個字符串長度是否不相等
[ ARG1 OP ARG2 ] ARG1和ARG2為整數或者取值為整數的變量;OP是-eq(相等),-ne(不相等),-lt(小于),-le(小于等于),-gt(大于),-ge(大于等于)中的一個

2、if/then/elif/else/fi
例1:

if [ -f /Users/charleswang/Programs/Fastfile ]; then 
echo "ture"; fi
ture

其實是三條命令,

if [ -f /Users/charleswang/Programs/Fastfile ]```
是第一條,
```then 
echo "ture" 

是第二條,

fi

是第三條。
如果兩條命令寫在同一行則需要用;號隔開,一行只寫一條命令就不需要寫;號了,
另外,then后面有換行,但這條命令沒寫完,Shell會自動續行,把下一行接在then后面當作一條命令處理。
和[命令一樣,要注意命令和各參數之間必須用空格隔開。
if命令的參數組成一條子命令,如果該子命令的Exit Status為0(表示真),則執行then后面的子命令,如果Exit Status非0(表示假),則執行elif、else或者fi后面的子命令。if后面的子命令通常是測試命令,但也可以是其它命令。Shell腳本沒有{}括號,所以用fi表示if語句塊的結束。

例2:

if :; then echo "always ture"; fi
always ture

:是一個特殊的命令,稱為空命令,該命令不做任何事,但Exit Status總是真。

例3:根據輸入判讀,輸出判斷結果

#/bin/bash
echo "Is it morning? Please answer yes or no."
read YES_OR_NO
if [ "$YES_OR_NO" = "yes" ]; then
echo "Good morning!"
elif [ "$YES_OR_NO" = "no" ]; then
echo "Good afternoon!"
else
echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
exit 1
fi
exit 0

上例中的read命令的作用是等待用戶輸入一行字符串,將該字符串存到一個Shell變量YES_OR_NO中。這里我們同exit指令來讓程序中斷,并回傳數值給系統。

命令行執行:

?  ~ sh /Users/charleswang/Programs/ShellTest.sh 
Is it morning? Please answer yes or no.
yes
Good morning!
?  ~
?  ~
?  ~
?  ~ sh /Users/charleswang/Programs/ShellTest.sh 
Is it morning? Please answer yes or no.
no
Good afternoon!

例4:多個輸入參數判斷,下例為輸入3個參數,首先判斷輸入參數個數是否小于2,如小于2個,則退出并輸出錯誤信息;若輸入大于2個參數,則分別賦值;并判斷第三個參數字符串長度是否為0,若長度為0,則默認賦值為'develop'

if [ "$#" -lt 2 ]; then
 echo "wrong paramters count, exit"
    exit
fi
git_branch=$1
build_type=$2

mail_group=$3
if [ -z $3 ]; then
mail_group='develop'
fi
echo "$# and $@ and ${1} and ${2} and $3"

備注:

參數 意義
$# 腳本中所有輸入的參數個數
$@ 逐個顯示所有參數值
${1} 獲取第一個參數
$3 獲取第三個參數

上例輸入輸出結果:

?  ~ sh /Users/charleswang/Programs/ShellTest.sh 3.8.2 release develop
3 and 3.8.2 release develop and 3.8.2 and release and develop

例5:多重條件判斷式(在上面的代碼基礎上直接添加如下代碼)

if [ "$#" -lt 3 -a "$3" == "develop" ]; then
echo "參數總個數小于3 and 第三個參數值為develop"
elif [ "$#" -gt 2 -a "$3" == "develop" ]; then
echo "參數總個數大于2 and 第三個參數值為develop"
else
echo "false"
fi

備注:if判斷后必須添加;和then來處理。elif也是判斷式,因此出現elif后面也要接then來處理。但是else已經是最后的沒有成立的結果了,所以else后面不需要接then.

邏輯符號 代表
-a 與,AND
-o 或,OR

例5:

s=0
i=0
while [ "$i" != "100" ]
do
i=$(($i+1))
s=$(($s+$i))
done
echo "result is => $s"

當[ "$i" != "100" ]條件成立時,就終止do執行的程序段,則否就執行。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Linux Shell 基本語法 一. Linux基本命令 1.1. cp命令 該命令的功能是將給出的文件或目錄拷...
    M_Baron閱讀 2,623評論 0 1
  • 創建腳本 可以使用 vi/vim 命令來創建文件),新建一個文件 test.sh,擴展名為 sh(sh代表shel...
    妮妮世界閱讀 308評論 0 0
  • 1.創建文件夾 !/bin/sh mkdir -m 777 "%%1" 2.創建文件 !/bin/sh touch...
    BigJeffWang閱讀 10,191評論 3 53
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,969評論 19 139
  • 學習做的筆記,以防日后忘記方便查詢??***********shell基本語法***********
    lunaSun閱讀 153評論 0 0