Linux进阶之路———Shell 编程入门
引言
通過 Shell 編程的學習,鋪平架構師道路上的一塊大磚。
Shell 在Linux 系統中的定位如下所示:
一、第一個 Shell 腳本
我們通過一個簡單的 Shell 腳本來感受一下。
在 Shell 中不需要加 “;” 結尾,通過 vim 可以進行 shell 的編程工作,并且一般建議為 shell 文件添加可執行權限。
更改權限之后,執行腳本:
另外如果沒有可執行權限,還可以通過 sh 來執行:
一般在企業中,都是需要加上可執行權限的。
注意,本片文章后面的內容全部忽略 chmod 操作。
二、Shell 變量
Shell 變量分為系統變量和用戶變量。
2.1 系統變量
系統變量指的是預先在 Linux 系統中定義好的變量(常量),如PATH 等。
另外,可以通過 set 命令來查看所有系統變量:
2.2 自定義變量
在 Shell 編程中,多數情況下會使用自定義變量。
基本語法:
1、賦值:變量名=值。注意,等號兩邊不能有空格,這是與其他編程語言有所區別的。
2、撤銷變量:unset? 變量名
3、聲明靜態變量:readonly? 變量名=值 。 注意:靜態變量不能 unset。
4、引用已定義的變量:$變量名? ? ?或? ? ?${變量名}? ? 。后者可以在連續的字符串中幫助 Shell 解釋器區分變量名的邊界。
5、變量名可以是字母、數字、下劃線 的組合,且不能以數字開頭。這與Java 的變量命名規則相同。
6、變量名一般習慣大寫。
7、將命令返回值賦給變量:第一種:反引號:A=`ls -l`? ; 第二種 :$(ls -l) 。兩種方式等價。
案例:定義一個 變量 A ,輸出,然后 unset ,再輸出:
案例:定義一個靜態變量 B,查看 unset 的效果:
可以看到,readonly 類型的變量是不能 unset 的。
2.3 環境變量
可以自定義環境變量,供其他程序使用。
第一步:vim? ?/etc/profile
第二步:export? 變量名=值? ? ? ? ? 功能:將 Shell 變量輸出為環境變量(或先定義變量,再 export $變量名)
第三步:source? /etc/profile? ? ? ? ?功能:讓修改后的配置信息立即生效
第四步:echo? $變量名? ? ? ? ? ? ? ? 功能:查詢環境變量的值。
vim 打開 profile 文件,在文件最末尾(輸入G),添加我們需要定義的環境變量 SAY_HELLO,保存并退出:?
然后刷新配置文件:source /etc/profile :
可以看到,變量可以被直接使用了,我們可以在其他的 Shell 文件中嘗試使用剛剛定義的環境變量:
可以看到,可以使用。
2.4 多行注釋
在 Shell 文件中使用? ? ?:<<!? xxxx? !? ? ?進行多行注釋。
2.5 位置參數變量
當我們執行一個Shell 腳本的時候,如果希望獲得命令行參數信息,可以通過位置參數變量。比如,我們執行 ./app.sh? 100? 200 ,這就是一個 Shell 的執行命令行,可以在 app.sh? 中動態獲得參數信息,即100 和 200。
常用的位置參數獲取方式有:
$n? ?: n 為大于等0 的自然數,其中 $0 表示 shell 文件本身,$1 - $9? 表示第一到第九個參數, 10 以上的參數需要寫作 ${10}。
$*? ?:? 表示命令行中的所有參數,注意,$* 把所有參數看做是一個整體。
$@ : 表示命令行中的所有參數,注意,$@ 把所有參數都區分對待。$* 和 $@ 這兩者主要在循環語句的時候可以看出區別。
$#? ?: 表示命令行中所有參數的個數。
演示:在 HelloWorld.sh 中輸出這些位置變量參數,然后觀察結果:
2.6 預定義變量
預定義變量指的是 Shell 設計者事先已經定義好的變量,可以直接在 Shell 腳本中使用:
$$? ? 表示當前進程的進程號(PID)
$!? ? ?表示后臺運行的最后一個進程的進程號(PID)
$?? ? 表示最后一次執行的命令的返回狀態。如果這個變量的值為0,證明上一個命令執行正確;如果這個變量的值非 0 (具體是哪個數,由命令自己決定),則證明上一個命令執行不正確。
演示:首先,我們定義一個新的 Shell 腳本:myShell.sh,然后通過其他的 Shell 來執行它,并輸出響應的預定義變量:?
myShell.sh:
HelloWorld.sh:
執行結果:
其中,在HelloWorld.sh? 中的 &? 符號,代表將Shell 腳本以后臺的方式運行。
三、運算符
第一種:$((運算式))
第二種:$[運算式]
第三種:expr 運算式(注意,expr 運算符之間要有空格,因為乘號需要轉義)
另外,還有一些常見的比較運算符:
=? 字符串比較
-lt? 小于
-le? ?小于等于
-eq? 等于
-gt? ?大于
-ge? 大于等于
-ne? ?不等于
四、Shell 條件判斷
4.1 基本的 if 判斷
基本語法:
if [ condition ]
注意,條件語句要與中括號之間有空格。
按照文件權限進行判斷:
-r? ?有讀的權限
-w? ?有寫的權限
-x? ? 有執行的權限
按照文件類型判斷:
-f? 文件存在 并且是一個常規文件
-e? 文件存在
-d? ?文件存在,并且是一個目錄
案例:實現一個Shell 程序,判斷輸入的參數,大于 60 ,則輸出 “及格了”,如果小于 60,則輸出“不及格”。
4.2 case 語句
基本語法:
case $變量 in "值1")執行語句1;; "值2")執行語句2;; "值3")執行語句3;; ...... *)沒有匹配項的執行語句;; esaccase 語句的功能和所有其他開發語言一致,不過語法有些不同。
案例:當命令行參數是 1 時,輸出 Mon,是 2 時,輸出 Tues,其他數字,則輸出 Other。
五、Shell 流程控制
5.1 for 循環
基本語法1:
for 變量 in 值1 值2 值3... do執行語句 done案例:打印命令行中的參數(使用 $*? 和 $@并觀察區別):
基本語法2:
for((初始值; 循環控制條件; 變量變化)) do執行語句 done案例:從1 加到 100 ,然后輸出顯示:
5.2 while循環
基本語法:
while [ 條件判斷 ] do執行語句 done案例:從命令行輸入一個數字 n ,統計 從1 加到 n? 的值是多少:
六、Shell 讀取控制臺輸入
基本語法:
read? [選項]? 變量名
選項及參數:
-p? ? 指定讀取值時的提示符
-t? ? ?指定讀取值時等待的時間(秒),如果沒有在指定時間內輸入,則不再等待。
變量名:指定讀取值的變量名
七、Shell 函數
Shell 編程和其他編程一樣,同樣存在系統函數,和自定義函數。其中有兩個比較重要的系統函數:
7.1 系統函數
1、basename 函數
功能: 返回完整的路徑最后 / 的部分,即獲取文件的文件名。
基本語法:
basename [pathname] [suffix]
suffix 是后綴,可以用于除去文件名的后綴名。
2、dirname 函數
功能:返回完整路徑最后 /? 的前面的部分,常用于返回路徑部分。
基本語法和 basename 完全一致。
7.2 自定義函數
基本語法:
[function]? 函數名[()] {執行語句[return int] }說明:Shell 函數不需要寫任何參數, return 返回,如果不加,將以最后一條命令運行結果作為返回值。return 后面跟0 ~ 255 的數值。調用函數直接書寫函數名稱即可,函數的返回值在調用函數后,通過 $? 來獲得。
另外,雖然 Shell 函數定義不需要定義參數,但是也是可以傳入參數的,不過語法比較奇怪,在調用的時候,我們可以這樣寫:
同樣也是可以的,但是注意,變量名要保持一致。也就是說,在 Shell 腳本文件中,不論是在哪里定義的變量,只要還在這個腳本文件中,就可以直接訪問。上圖也看到,我們在 readNum 函數中通過控制臺,讀入了兩個數字 n1 和 n2 ,直接在twoSum 函數體中使用也是可以的。另外, readNum 沒有返回語句,默認也是最后一行語句執行的結果。
?
綜上,就是關于Shell 編程的入門知識,后面還會增加相關的文章,歡迎大家文末留言。
總結
以上是生活随笔為你收集整理的Linux进阶之路———Shell 编程入门的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Maven学习(一)————Maven技
- 下一篇: Java 动态代理解析
