初識Bash編程

在前一篇文章里面(怎樣入Bash編程的坑?),我們列出了的很多Bash的資料。這篇文章是其中一篇的整理而來啄寡,原文的地址為Bash -- Standard Shell

Bash Conditionals -- 條件語句

基本的選擇

最基礎的條件語句就是if了:

if something ; then
    do_stuff;
fi

fi收尾,這個千萬不要忘了哩照。

多條分支的條件語句

這個很顯然了挺物,使用elseelif來走不同的邏輯分支:

if something ; then
    do_stuff
elif something_else ; then
    do_other_stuff
elif full_moon ; then
    howl
else
    turn_into_a_newt
fi

注意,在條件語句下飘弧,每個區(qū)塊中必須要有至少一行語句识藤,即下面的寫法是錯誤的:

if some_stuff ; then
    # A statement is required here. a blank or a comment
    # isn't enough!
else
    einfo "Not some stuff"
fi

如果你實在是沒有語句可以放,可以用:來表示空語句次伶,類似python中的pass

if some_stuff ; then
    # Do nothing
    :
else
    einfo "Not some stuff"
fi

條件檢驗

進行比對或者是文件的屬性檢驗時痴昧,相關的語句需要用[]或者[[]]框起來

# is $foo zero length?
if [[ -z "${foo}" ]] ; then
    die "Please set foo"
fi

# is $foo equal to "moo"?
if [[ "${foo}" == "moo" ]] ; then
    einfo "Hello Larry"
fi

# does "${ROOT}/etc/deleteme" exist?
if [[ -f "${ROOT}/etc/deleteme" ]] ; then
    einfo "Please delete ${ROOT}/etc/readme manually!"
fi

注意一般[[]]要比[]安全一些,盡量多使用前者吧

這是因為[[]]是bash的一個語法結構冠王,而[]中框起來的語句其實是被視為內(nèi)聯(lián)的赶撰。看下面這個例子:

bash$ [ -n $foo ] && [ -z $foo ] && echo "huh?"
huh?
bash$ [[ -n $foo ]] && [[ -z $foo ]] && echo "huh?"
bash$

字符串比對

一般的字符串比對形式為string1 operator string2,其中操作符可以為

Operator Purpose
==或者= 字符串相等
!= 字符串不等
< 按字典順序小于
> 按字典順序大于
=~ 正則匹配(Bash 3 Only)

字符串檢驗

通常字符串檢驗的形式為-operator "string"豪娜,其中操作符可以為

Operator Purpose
-z 字符串長度為0
-n 字符串長度非0

注意:如果你確認一個變量被設置了而且非空餐胀,使用`-n "${BLAH}",而非"-n $BLAH"瘤载,后一種情況在變量未設置時會出錯否灾。

整型數(shù)比較

通常整型數(shù)比較的形式為int1 -operator int2,可選的操作符如下:

Operator Purpose
-eq 等于
-ne 不等
-lt 小于
-le 小于或等于
-gt 大于
-ge 大于或等于

文件檢驗

文件檢驗的形式為-operator "filename"鸣奔,其中操作符為可以:

Operator Purpose
-a file Exists (use -e instead)
-b file Exists and is a block special file
-c file Exists and is a character special file
-d file Exists and is a directory
-e file Exists
-f file Exists and is a regular file
-g file Exists and is set-group-id
-h file Exists and is a symbolic link
-k file Exists and its sticky bit is set
-p file Exists and is a named pipe (FIFO)
-r file Exists and is readable
-s file Exists and has a size greater than zero
-t fd Descriptor fd is open and refers to a terminal
-u file Exists and its set-user-id bit is set
-w file Exists and is writable
-x file Exists and is executable
-O file Exists and is owned by the effective user id
-G file Exists and is owned by the effective group id
-L file Exists and is a symbolic link
-S file Exists and is a socket
-N file Exists and has been modified since it was last read

文件比較

文件比較的一般形式為"fille1" -operator "file2"墨技。其中 操作符如下:

Operator Purpose
file1 -nt file2 文件1比文件2更新(根據(jù)修改日期比較),或者文件1存在而文件2不存在
file1 -ot file2 文件1比文件2更舊挎狸,或者文件1不存在而文件2存在
file1 -ef file2 file1 and file2 refer to the same device and inode numbers.

布爾運算

||或扣汪,&&與,!非锨匆。

注意:在[[]]內(nèi)部崭别,[[ ! -f file ]] && bar可以工作,而[[ -f foo && bar]]則無法正常工作统刮,這是因為[[]]內(nèi)無法運行命令。

Bash中的遍歷結構

和其他的編程語言類似账千,遍歷結構分為兩種侥蒙,for關鍵詞和while關鍵詞。

下面是一些例子的

for myvar in "the first" "the second" "and the third" ; do
    einfo "This is ${myvar}"
done

for (( i = 1 ; i <= 10 ; i++ )) ; do
    einfo "i is ${i}"
done

while hungry ; do
    eat_cookies
done

Bash中的變量操作

在bash中匀奏,關于${}結構鞭衩,在一些情況下可以用來操作變量或者獲取變量的信息。使用這個特性可以避免相對來說比較耗性能的(或者illegal的)sed系列指令娃善。

獲取字符串長度

${#somevar}可以用來獲取字符串的長度

somevar="Hello World"
echo "${somevar} is ${#somevar} characters long"

變量的默認值

Bash中有很多的方法來為未設置或者空的變量設置一個默認值论衍。${var:-value}這個結構,在var未設置或者為空的時候為var提供默認值value聚磺。${var-value}的功能基本是相同的坯台,但是如果var這個變量被聲明了,但是為空瘫寝,此時兩者的表現(xiàn)會不同:

var=          # declared but not set
echo ${var:-default}    # var獲得默認值default
var2=        # declared but not set
echo ${var2-default}      # var仍為空

${var:=value}${var=value}var沒有設置值時(null)為其填充value值蜒蕾。冒號的作用和上面的是一樣的。

${var:?message}這個命令焕阿,會在var這個變量未設置或者為空時咪啡,顯示message的信息并終止程序。這里也有去掉冒號的形式${var?message}.

${var:+value}命令作用恰好想法暮屡,如果var有值了撤摸,則返回value,否則返回空字符串。

提取substring

提取substring准夷,主要是使用到${var:offset}${var:offset:length}钥飞,這兩個命令。其中offset參數(shù)的作用方式和python是類似的冕象,當offset為正數(shù)時代承,偏移量從左至右算,為負數(shù)時從右至左算渐扮。

Command Substitution

$(command)這個命令可以將command命令的stdout輸出捕獲并返回為一個字符串论悴。

注意:\command` 也可以起到類似的作用,但是你最好還是使用$(command)`墓律,畢竟后者更加簡潔可讀膀估,也方便嵌套使用。

字符串替換

Bash中一共提供了三種字符串替換的方式: ${var#pattern}耻讽,${var%pattern}察纯,${var/pattern/replacement}。前兩個用來進行刪除操作针肥。

${var#pattern}命令會返回將var的饼记,從字符串其實處開始的符合pattern的最短的子字符串刪除之后余下的結果,如果沒有匹配的慰枕,則返回var本身具则。如果要刪除最長的子字符串,使用${var##pattern}

${var%pattern}類似具帮,不過子字符串從字符串尾部算起博肋。相應的,如果想用貪心模式蜂厅,重復百分號即可${var%%pattern}匪凡。

${var/pattern/replacement}可以用replacement替換第一個匹配項。如果想要替換所有的匹配項 掘猿,就需要使用${var//pattern/replacement}

Bash的代數(shù)計算擴展

$(( expression))這個機構提供了代數(shù)計算的擴展病游,其中expression表達式有著類C的結構。下面是你可以采用操作符稠通,他們的定義基本是和C語言是一樣的:

Operators Effect
var++, var-- Variable post-increment, post-decrement
++var, --var Variable pre-increment, pre-decrement
-, + Unary minus and plus
!, ~ Logical negation, bitwise negation
** Exponentiation
*, /, % Multiplication, division, remainder
+, - Addition, subtraction
<<, >> Left, right bitwise shifts
<=, >=, <, > Comparison: less than or equal to, greater than or equal to, strictly less than, strictly greater than
==, != Equality, inequality
& Bitwise AND
^ Bitwise exclusive OR
| Bitwise OR
&& Logical AND
| | Logical OR
expr ? expr : expr Conditional operator
=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, | = Assignment
expr1 , expr2 Multiple statements

|

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末礁遵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子采记,更是在濱河造成了極大的恐慌佣耐,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唧龄,死亡現(xiàn)場離奇詭異兼砖,居然都是意外死亡奸远,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門讽挟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懒叛,“玉大人,你說我怎么就攤上這事耽梅⊙” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵眼姐,是天一觀的道長诅迷。 經(jīng)常有香客問我,道長众旗,這世上最難降的妖魔是什么罢杉? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮贡歧,結果婚禮上滩租,老公的妹妹穿的比我還像新娘。我一直安慰自己利朵,他們只是感情好律想,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绍弟,像睡著了一般技即。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晌柬,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天姥份,我揣著相機與錄音郭脂,去河邊找鬼年碘。 笑死,一個胖子當著我的面吹牛展鸡,可吹牛的內(nèi)容都是我干的屿衅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼莹弊,長吁一口氣:“原來是場噩夢啊……” “哼涤久!你這毒婦竟也來了?” 一聲冷哼從身側響起忍弛,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤响迂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后细疚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔗彤,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了然遏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贫途。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖待侵,靈堂內(nèi)的尸體忽然破棺而出丢早,到底是詐尸還是另有隱情,我是刑警寧澤秧倾,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布怨酝,位于F島的核電站,受9級特大地震影響中狂,放射性物質(zhì)發(fā)生泄漏凫碌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一胃榕、第九天 我趴在偏房一處隱蔽的房頂上張望盛险。 院中可真熱鬧,春花似錦勋又、人聲如沸苦掘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹤啡。三九已至,卻和暖如春蹲嚣,著一層夾襖步出監(jiān)牢的瞬間递瑰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工隙畜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抖部,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓议惰,卻偏偏與公主長得像慎颗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子言询,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

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