shell腳本學(xué)習(xí)(二)

目錄

  • 替換
  • 運算符

1、替換

如果表達式中包含特殊字符梭姓,Shell 將會進行替換遵班。例如屠升,在雙引號中使用變量就是一種替換,轉(zhuǎn)義字符也是一種替換狭郑。
示例:

#!/bin/bash
a=10
echo -e "a is $a \n"

輸出:

a is 10

這里-e表示對轉(zhuǎn)義字符進行替換腹暖。如果不使用 -e 選項,將會原樣輸出:a is 10 \n
可以使用echo命令的 -E選項禁止轉(zhuǎn)義翰萨,默認也是不轉(zhuǎn)義的脏答;使用-n選項可以禁止插入換行符。

變量替換

變量替換可以根據(jù)變量的狀態(tài)(是否為空亩鬼、是否定義等)來改變它的值
可以使用的變量替換形式:

形式 說明
${var} 變量本來的值
${var:-word} 如果變量 var 為空或已被刪除(unset)以蕴,那么返回 word,但不改變 var 的值辛孵。
${var:=word 如果變量 var 為空或已被刪除(unset)丛肮,那么返回 word,并將 var 的值設(shè)置為 word魄缚。
${var:?message} 如果變量 var 為空或已被刪除(unset)宝与,那么將消息 message 送到標準錯誤輸出焚廊,可以用來檢測變量 var 是否可以被正常賦值。若此替換出現(xiàn)在Shell腳本中习劫,那么腳本將停止運行咆瘟。
${var:+word} 如果變量 var 被定義,那么返回 word诽里,但不改變 var 的值袒餐。

示例:

echo ${var:-"變量未定義"}
echo "1 - var的值:${var}"

echo ${var:="var已經(jīng)有值"}
echo "2 - var的值:${var}"

unset var
echo ${var:+"var變量被刪除"}
echo "3 - var的值:$var"

var="Prefix"
echo ${var:+"var被賦值Prefix"}
echo "4 -var的值:$var"

unset var
echo ${var:?"打印信息"}
echo "5 - var的值:${var}"

輸出:

變量未定義
1 - var的值:
var已經(jīng)有值
2 - var的值:var已經(jīng)有值

3 - var的值:
var被賦值Prefix
4 -var的值:Prefix
./test.sh: line 18: var: 打印信息

2、運算符

Bash支持很多運算符谤狡,包括算數(shù)運算符灸眼、關(guān)系運算符、布爾運算符墓懂、字符串運算符和文件測試運算符焰宣。
原生bash不支持簡單的數(shù)學(xué)運算,但是可以通過其他命令來實現(xiàn)捕仔,例如awkexpr匕积,expr最常用。
expr是一款表達式計算工具榜跌,使用它能完成表達式的求值操作闪唆。
示例:

var=`expr 2 + 2`
echo $var

輸出結(jié)果4,

兩點注意:
表達式和運算符之間要有空格,例如 2+2 是不對的钓葫,必須寫成 2 + 2苞氮,這與我們熟悉的大多數(shù)編程語言不一樣。
完整的表達式要被 包含瓤逼,注意這個字符不是常用的單引號笼吟,在 Esc 鍵下邊。

算術(shù)運算符

先來看一個使用算術(shù)運算符的例子:

#!/bin/sh
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
   echo "a is equal to b"
fi
if [ $a != $b ]
then
   echo "a is not equal to b"
fi

輸出:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a is not equal to b

乘號(*)前邊必須加反斜杠()才能實現(xiàn)乘法運算霸旗;

關(guān)系運算符

關(guān)系運算符只支持數(shù)字贷帮,不支持字符串,除非字符串的值是數(shù)字诱告。
示例:

#!/bin/sh
a=10
b=20

if [ $a -eq $b ]
then
echo "$a -eq $b : a撵枢、b相等"
else
echo "$a -eq $b: a、b不等"
fi

if [ $a -ne $b ]
then
echo "$a -ne $b: a精居、b不等"
else
echo "$a -ne $b : a锄禽、b相等"
fi

if [ $a -gt $b ]
then
echo "$a -gt $b: a大于b"
else
echo "$a -gt $b: a不大于b"
fi

if [ $a -lt $b ]
then
echo "$a -lt $b: a小于b"
else
echo "$a -lt $b: a不小于b"
fi

if [ $a -ge $b ]
then
echo "$a -ge $b: a大于等于b"
else
echo "$a -ge $b: a小于b"
fi

if [ $a -le $b ]
then
echo "$a -le $b: a小于等于b"
else
echo "$a -le $b: a大于b"
fi

輸出:

10 -eq 20: a、b不等
10 -ne 20: a靴姿、b不等
10 -gt 20: a不大于b
10 -lt 20: a小于b
10 -ge 20: a小于b
10 -le 20: a小于等于b

運算符 | 說明 | 舉例
------------ | :------------- |:------------ |:
-eq | 檢測兩個數(shù)是否相等沃但,相等返回 true。 | [ $a -eq $b ] 返回 false佛吓。
-ne | 檢測兩個數(shù)是否相等宵晚,不相等返回 true垂攘。 | [ $a -ne $b ] 返回 true
-gt | 檢測左邊的數(shù)是否大于右邊的,如果是淤刃,則返回 true | [ $a -gt $b ] 返回 false晒他。
-lt | 檢測左邊的數(shù)是否小于右邊的,如果是逸贾,則返回 true | [ $a -lt $b ] 返回 true
-ge | 檢測左邊的數(shù)是否大等于右邊的陨仅,如果是,則返回 true | [ $a -ge $b ] 返回 false
-le | 檢測左邊的數(shù)是否小于等于右邊的铝侵,如果是灼伤,則返回 true | [ $a -le $b ] 返回 true

布爾運算符

示例:

#!/bin/sh
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a is not equal to b"
else
echo "$a != $b: a is equal to b"
fi

if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a -lt 100 -a $b -gt 15 : returns true"
else
echo "$a -lt 100 -a $b -gt 15 : returns false"
fi

if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : returns true"
else
echo "$a -lt 100 -o $b -gt 100 : returns false"
fi

輸出:

10 != 20 : a is not equal to b
10 -lt 100 -a 20 -gt 15 : returns true
10 -lt 100 -o 20 -gt 100 : returns true

運算符 | 說明 | 舉例
------------ | :------------- |:------------ |:
! | 非運算,表達式為 true 則返回 false哟沫,否則返回 true。 | [ ! false ] 返回 true
-o | 或運算锌介,有一個表達式為 true 則返回 true | [ $a -lt 20 -o $b -gt 100 ] 返回 true
-a | 與運算嗜诀,兩個表達式都為 true 才返回 true| [ $a -gt $b ] [ $a -lt 20 -a $b -gt 100 ] 返回 false

字符串運算符

示例:

#!/bin/sh
a="hello world"
b="你好 世界"
if [ "$a" = "$b" ]
then
    echo "a、b相等"
else
    echo "a孔祸、b不相等"
fi

if [ "$a" != "$b" ]
then
    echo "a隆敢、b不相等"
else
    echo "a、b相等"
fi

if [ -z "$a" ]
then
    echo "字符創(chuàng)a的長度為0"
else
    echo "字符串a(chǎn)的長度不為0"
fi

if [ -n "$a" ]
then
echo "字符串a(chǎn)的長度不為0"
else
echo "字符串a(chǎn)的長度為0"
fi

if [ "$a" ]
then
echo "字符串a(chǎn)不為空"
else
echo "字符串a(chǎn)為空"
fi

輸出:

a崔慧、b不相等
a拂蝎、b不相等
字符串a(chǎn)的長度不為0
字符串a(chǎn)的長度不為0
字符串a(chǎn)不為空

注意:if [-z $a],最好寫成這樣:if [-z "$a"],惶室,shell可能會出現(xiàn)警告:too many arguments

運算符 | 說明 | 舉例
------------ | :------------- |:------------ |:
= | 檢測兩個字符串是否相等温自,相等返回 true | [ $a = $b ] 返回 false
!= | 檢測兩個字符串是否相等,不相等返回 true | [ $a != $b ] 返回 true
-z | 檢測字符串長度是否為0皇钞,為0返回 true| [ -z $a ] 返回 false
-n | 檢測字符串長度是否為0悼泌,不為0返回 true| [ -n $a ] 返回 true
str | 檢測字符串是否為空,不為空返回 true| [ $a ] 返回 true

文件測試運算符

示例:

#!/bin/sh
file="/Users/chenzhichao/Desktop/1.png"
if [ -e $file ]
then
    echo "文件存在"
else
    echo "文件不存在"
fi

if [ -r $file ]
then
echo "文件可讀"
else
echo "文件不可讀"
fi

if [ -w $file ]
then
echo "文件可寫"
else
echo "文件不可寫"
fi

if [ -x $file ]
then
echo "文件可執(zhí)行"
else
echo "文件不可執(zhí)行"
fi

if [ -d $file ]
then
echo "文件是目錄"
else
echo "文件不是目錄"
fi

輸出:

文件存在
文件可讀
文件可寫
文件不可執(zhí)行
文件不是目錄

文件權(quán)限可以點擊文件右鍵->簡介(屬性)->共享與權(quán)限夹界,可以修改權(quán)限


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馆里,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子可柿,更是在濱河造成了極大的恐慌鸠踪,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件复斥,死亡現(xiàn)場離奇詭異营密,居然都是意外死亡,警方通過查閱死者的電腦和手機目锭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門卵贱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滥沫,“玉大人,你說我怎么就攤上這事键俱±夹澹” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵编振,是天一觀的道長缀辩。 經(jīng)常有香客問我,道長踪央,這世上最難降的妖魔是什么臀玄? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮畅蹂,結(jié)果婚禮上健无,老公的妹妹穿的比我還像新娘。我一直安慰自己液斜,他們只是感情好累贤,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著少漆,像睡著了一般臼膏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上示损,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天渗磅,我揣著相機與錄音,去河邊找鬼检访。 笑死始鱼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的脆贵。 我是一名探鬼主播风响,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丹禀!你這毒婦竟也來了状勤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤双泪,失蹤者是張志新(化名)和其女友劉穎持搜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焙矛,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡葫盼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了村斟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贫导。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡抛猫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孩灯,到底是詐尸還是另有隱情闺金,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布峰档,位于F島的核電站败匹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏讥巡。R本人自食惡果不足惜掀亩,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望欢顷。 院中可真熱鬧槽棍,春花似錦、人聲如沸抬驴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽怎爵。三九已至特石,卻和暖如春盅蝗,著一層夾襖步出監(jiān)牢的瞬間鳖链,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工墩莫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芙委,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓狂秦,卻偏偏與公主長得像灌侣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子裂问,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理侧啼,服務(wù)發(fā)現(xiàn),斷路器堪簿,智...
    卡卡羅2017閱讀 134,701評論 18 139
  • FreeMarker的模板文件并不比HTML頁面復(fù)雜多少,FreeMarker模板文件主要由如下4個部分組成: 1...
    年輕小伙程序員閱讀 3,009評論 0 5
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,238評論 0 4
  • 基礎(chǔ) 頭文件 #!/bin/bash 或者#!/bin/sh #!約定的標記痊乾,如IOS的Import 執(zhí)行文件時需...
    ZMJun閱讀 1,234評論 1 2
  • 舊時作。 好友相聚椭更,?歡飲不知時日哪审,以 為記。 溪橋人靜虑瀑,晨霜凝樹湿滓,一夜白頭江渚滴须。 別來檐雀去無蹤,荒煙繞叽奥、野村澤...
    青簡書閱讀 286評論 0 3