Shell基本語法

腳本Demo:Github地址

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

(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

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

判斷語句 意義
[ -d DIR ] DIR是否存在并且是一個目錄
[ -e FILE ] FILE是否存在
[ -f FILE ] FILE是否存在并且是一個普通文檔
[ -r FILE ] FILE是否具有可讀權(quán)限
[ -w FILE ] FILE是否具有可寫權(quán)限
[ -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為整數(shù)或者取值為整數(shù)的變量;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會自動續(xù)行,把下一行接在then后面當(dāng)作一條命令處理。
和[命令一樣,要注意命令和各參數(shù)之間必須用空格隔開。
if命令的參數(shù)組成一條子命令,如果該子命令的Exit Status為0(表示真),則執(zhí)行then后面的子命令,如果Exit Status非0(表示假),則執(zhí)行elif、else或者fi后面的子命令。if后面的子命令通常是測試命令,但也可以是其它命令。Shell腳本沒有{}括號,所以用fi表示if語句塊的結(jié)束。

例2:

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

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

例3:根據(jù)輸入判讀,輸出判斷結(jié)果

#/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ù)值給系統(tǒng)。

命令行執(zhí)行:

?  ~ 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:多個輸入?yún)?shù)判斷,下例為輸入3個參數(shù),首先判斷輸入?yún)?shù)個數(shù)是否小于2,如小于2個,則退出并輸出錯誤信息;若輸入大于2個參數(shù),則分別賦值;并判斷第三個參數(shù)字符串長度是否為0,若長度為0,則默認(rèn)賦值為'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"

備注:

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

上例輸入輸出結(jié)果:

?  ~ 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:多重條件判斷式(在上面的代碼基礎(chǔ)上直接添加如下代碼)

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

備注:if判斷后必須添加;和then來處理。elif也是判斷式,因此出現(xiàn)elif后面也要接then來處理。但是else已經(jīng)是最后的沒有成立的結(jié)果了,所以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"

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容