Shell腳本是包含一些命令或聲明,并符合一定格式的文本文件。
程序:指令+數據
程序編程風格
過程式 以指令為中心,數據服務于指令。
對象式 以數據為中心,指令服務于數據。
Shell程序:提供了編寫和能力,解釋執行。
編程邏輯處理方式:
順序執行
循環執行
選擇執行
Shell編程:過程式,解釋執行
編程語言的基本結構
數據存儲:變量,數組
表達式: a+b
語句: if
創建shell腳本
第一步 使用文本編輯器來創建文本文件,第一行必須包括shell聲明序列:#!
eg: #!/bin/bash
#!author:
#!version:
#!descriptio:
腳本正文
:wq (保存)
第二步 運行腳本
給予執行權限,在命令行上指定腳本的絕對路徑或相對路徑。
直接運行解釋器,將腳本最為解釋器程序的參數執行。
當執行shell腳本時,比如說將腳本存放在/testdir目錄中執行時要將該腳本的絕對路徑或相對路徑寫上。
例如:
絕對路徑 /testdir test.sh
相對路徑 ./test.sh
如果不寫腳本的路徑時,系統找的是$PATH變量的路徑,當前腳本的路徑不在$PATH變量的路徑中時,該腳本是不會運行的。
在linux中。系統執行程序時,是不去找當前路徑的,即便程序就在當前路徑中,也是只搜$PATH變量。
如果希望程序能在當前路徑下運行,我們可以用修改$PATH變量的方法來實現。
以修改root的$PATH變量為例,在root的家目錄下有一隱藏文件 .bash_profile。用vim打開.bash_profile文件,修改PATH=$PATH:$HOME/bin。在bin后面加“:.”后面的點表示當前路徑。
在PATH=$PATH:$HOME/bin:.這條命令中,腳本的執行順序是:先找$PATH再找$HOME/bin,最后找當前路徑,所以將“· ”放到最前也是可以的。
當vim設置好保存退出后。$PATH不能及時生效,需要執行 . .bash_profile,$PATH才能生效。
最后在當前路徑下執行一個腳本測試是否運行,運行則修改成功,不運行則修改未成功。
但是一般不將當前路徑添加進$PATH這樣做不安全。
變量
變量:命名的內存空間
數據存儲的方式:
字符
數值:整型 浮點型
命令執行優先級:別名→內部命令→hash到內存中的外部命令→外部命令
變量類型:
作用:
數據存儲格式
參與的運算
表示的數據范圍
變量命名的法則:
不能使用程序中的保留字,例如if for
可以使用數字、字母及下劃線,但是不能以數字開頭。
見名知義。
同一命名規則。
管理員自己定義$PATH變量
例如:var1=test 這個var1變量的內容就是test,不區分大小寫。
變量的名稱可以隨便起。但是數字例外,組合也是可以的,但是數字不能開頭。
定義完成后,如果該變量不想要了也可以刪除,執行unset var1。不用再var1前面加”$”,因為unset是專門刪除變量的。
用echo $var1驗證,不會顯示結果。代表unset執行成功,但是系統會生成一個空的$var1。
變量用完后應及時用unset刪除,如果不刪除,則變量會一直存在于內存中,消耗內存資源。
Set命令可以查看所有變量
變量種類
本地變量
直接在當前的腳本或shell中直接寫一個變量的賦值,比如說:var1=test,var1這個
變量是基于本地的,只能在本地終端中用,換個終端就無法執行了。
編寫第一個腳本 Var.sh
當我們將在腳本中定義好的腳本中的變量var1=haha拿到外面echo $var1執行的時候,是沒有結果的,說明var1這個變量只能在腳本內起作用。執行var.sh這個腳本的時候,執行結果也是為空。
將var.sh腳本稍作修改
當再去執行var.sh腳本的時候,顯示了$var1的變量結果:haha,所以該變量只能自己用。
編寫第二個腳本 var2.sh
執行var2.sh腳本。顯示了$var2的變量結果:xixi
這兩個腳本各自顯示各自的變量值,互不影響。
將var.sh這個變量稍作修改,讓其調用var2.sh
執行var.sh腳本 分別顯示了var.sh的值,也顯示了var2.sh的值
將var2.sh腳本稍作修改
執行var2.sh
上圖顯示第二行var2.sh中顯示的是空。當var2.sh嘗試去調用$var1的變量結果的時候,沒有成功,因為$var1變量是在var.sh中定義的,var2,sh本身沒有,所以調用失敗。
可以講var.sh與var2.sh做個對比
從上圖的對比中可以看出,var.sh不僅顯示了自己的執行結果,還調用了var2.sh的執行結果。但是var2.sh顯示了自己的執行結果,但是當它嘗試去調用$var1變量的的結果的時候卻失敗了,因為$var1的變量是定義在var.sh腳本中的,其本身并沒有,所以無法直接調用。
Var.sh調用var1.sh,其調用的關系就是父子進程的關系。
本地變量的有效范圍是不能直接在當前shell中有效,甚至是子進程都不能使用。
環境變量
環境變量具有繼承性,在變量前夾export就可以將$v1變量繼承下去。
新建腳本var1.sh
var1.sh腳本不僅顯示自己的結果,還去調用var2.sh的結果。
新建腳本var2.sh
var2.sh腳本不僅顯示自己的結果,還去調用$v2變量和var3.sh腳本的結果
新建腳本var3.sh
var3.sh腳本調用$v1變量的結果。
當執行var1.sh的時候,var2.sh var3.sh都可以調用$v1變量的結果。
只讀變量
也稱為常量,比如定義圓周率,P=3.14159。有可能會被修改。如果不想被修改,則用readonly將P定義為只讀變量,便無法修改。
只讀變量甚至刪業無法執行,除非程序退出,再進入,則只讀變量自動消失。
位置變量
新建腳本test.sh
執行test.sh腳本
上圖中,$1相當于 aa ,$2相當于bb,$3想當于cc,$*相當于aa bb cc dd。
在腳本代碼中,調用通過命令行傳遞給腳本的參數。
$1 、$2……….對應第一、第二個參數。Shift[n]表示換位置
$0 代表命令本身
$* 傳遞給腳本的所有參數,全部合為一個字符串
$@ 傳遞給腳本的所有參數,每個參數都為獨立的字符串
$# 傳遞給腳本的參數的個數
邏輯運算
True false
1 0
? 與: 或:
1 與 1 = 1 1 或 1 = 1
1 與 0 = 0 1 或 0 = 1
0 與 1 = 0 0 或 1 = 1
0 與 0 = 0 0 或 0 = 0
邏輯運算
? 非:!
! 1 = 0
! 0 = 1
? 短路運算:
短路與:
第一個為0,結果必定為0;
第一個為1,第二個必須要參與運算;
短路或:
第一個為1,結果必定為1;
第一個為0,第二個必須要參與運算;
?
異或: ^
異或的兩個值,相同為假,不同為真。
Exp1=exp2 假
Exp1!=exp2 真
原創文章,作者:zzd,如若轉載,請注明出處:http://www.www58058.com/35756
總結的很詳細,并且通過具體操作加深了自己對變量的理解,