Shell 語言作為類 Unix 系統的原生腳本,有着非常實用的價值。但對於很多剛剛接觸 Shell 腳本的同學來說,搞懂 Shell 語言的語法卻是一件非常困難的事情。甚至有人吐槽,或許沒有誰能清楚地說明白 Shell 的語法。
例如下面這兩個 Shell 腳本:
#!/bin/bash
a=10
if [ $a = 10 ]
then
echo "a is 10"
else
echo "a is not 10"
fi
#!/bin/bash
a=10
if [$a = 10 ] # $a 前沒有加空格,非法
then
echo "a is 10"
else
echo "a is not 10"
fi
這兩個腳本的區別只是 if 中的判斷表達式,一個有空格,一個沒有空格而已。但在 Shell 語法中,第二個沒有在$a
前加空格的腳本是非法的。再舉一個例子:
a=10
a = 10
在我們看來這兩個表達式沒有什么區別嘛,都是給 a 變量賦值 10。但實際上在 Shell 語法中,第一個表達式a=10
表示賦值,第二個表達式a = 10
表示判斷(判斷 a 是否等於 10)。
又例如 Shell 中我們要進行數學運算,其實有很多種方式可以實現,例如:
#!/bin/bash
a=`expr 10 + 5`
echo $a
當然了,你還可以這么寫:
#!/bin/bash
let a=10+5
echo $a
這兩種方式都可以實現簡單的數學運算。但相比這兩種,我更推薦用下面這種形式:
(( a = 10 + 5 ))
echo $a
即將需要運算的內容放在兩對中括號里面。因為這種方式更加簡潔,並且功能也是最為完整,也是最為接近高級語言的寫法。
正是因為 Shell 中的語法問題以及實現的多樣性,許多初學者(包括我)都會對 Shell 語法感到迷惑。因此我有了寫一個 Shell 快速入門系列的想法。
寫作思路
為了能快速上手 Shell 語法,在很多時候我會對一些不是很重要的內容進行舍棄。這些內容則會作為補充內容在后續的文章中說明。例如在 Shell 中有許多種循環結構:for 循環、while 循環、util 循環,但實際上 while 循環和 until 循環基本上是一樣的。在這種情況下我舍棄對於 until 循環這個語法的介紹。
例如在 Shell 中進行數學運算有很多種方式,可以使用-eq
操作符,可以使用==
操作符,可以使用=
操作符、可以使用(())
操作符等等。這個時候我也會進行取舍,取一種最簡單、最通用的語法來實現。舍棄一些復雜的語法並不會影響我們使用 Shell 語言,反而會讓我們更快入手。
這是本系列跟其他 Shell 入門教程的最大不同,即以快速入手為目的,並不追求大而全。對於入門系列的文章,目前寫了大概十四篇。每篇文章閱讀不會超過 10 分鍾,每個知識點都有相應的代碼可以運行,確保小白都能看得懂。
- Shell 快速入門(零):目錄
- Shell 快速入門(一):基礎概念
- Shell 快速入門(二):環境搭建
- Shell 快速入門(三):文件結構
- Shell 快速入門(四):如何運行shell腳本
- Shell 快速入門(五):如何標記語句的結束
- Shell 快速入門(六):基本數據類型
- Shell 快速入門(七):變量的使用
- Shell 快速入門(八):如何打印字符串
- Shell 快速入門(九):如何進行數學運算
- Shell 快速入門(十):如何進行數值比較
- Shell 快速入門(十一):如何進行字符串比較
- Shell 快速入門(十二):選擇結構怎么寫
- Shell 快速入門(十三):循環結構怎么寫
- Shell 快速入門(十四):函數的使用
我覺得這種系列學習的文章並不適合放在公眾號里發表,所以公眾號的朋友可以通過我的個人博客:http://shuyi.me 來查看。
知識體系
那如果我想要用到更高級的語法怎么辦?我的思路是直接搜索資料或者到下面的文章中看看。下面的文章是快速入門的延續,但是是較為高級的用法,我會根據我自身情況不斷地增加內容,構建起 Shell 整套體系。希望在不久的將來,這一系列入門教程能夠覆蓋大多數的應用情況。
如果你有想補充的知識點,歡迎關注我的微信公眾號,回復入群與我交流。
如果你想了解高級的用法,可以看下面的這些文章:
- Shell 快速入門(十五):輸出重定向
- Shell 快速入門(十六):如何進行文件判斷
- Shell 快速入門(十七):如何使用數組
- Shell 快速入門(十八):特殊符號的使用
- Shell 快速入門(十九):邏輯運算符的使用
- Shell 快速入門(二十):關系運算符的使用
- Shell 快速入門(二十一):算術運算符的使用
更新
- 2018-07-04 08:23:40 更新。因為每篇的篇幅很短,不適合在博客園發表,所以需要看的可以點擊鏈接到我的博客看。
- 2018-07-05 20:23:27 更新。這個系列寫完之后發現還是有許多寫得不好的地方,后續會不斷進行再寫。大家有什么問題都可以留言,或者通過我的公眾號加入微信群交流。
- 2018-07-05 21:43:12 更新:完善了輸出重定向章節。