linux學習—shell腳本知識點總結
目錄
什麽是Shell
腳本的運行方法
#!(讀shabang)的作用詳解
結合案例分析變量類型
特殊變量及其$@ $*的區別
退出狀態
算數運算
test和[ expression ]判斷
一、什麽是Shell
我們知道管理整個計算機硬件的其實是核心(kernel),用戶都是以Shell來與核心溝通,只要有操作系統,就離不開Shell。
如圖顯示了Shell,用戶和硬件的關系,形象的說Shell就是用戶控制硬件的一種語言工具。
二、腳本的運行方法
①chmod u+x 腳本名
然後直接輸入腳本路徑執行
(要求shell腳本中第一行加入#!解釋器)
(因為這是文件執行,需要有執行權限)
②/bin/bash 腳本名
(如果shell腳本中第一行加入#!解釋器,則自動忽略,仍然以bash作為shell)
(這是運用解釋器處理文件,所以不需要給文件加執行權限)
總之,上述的兩種方法中真正執行永遠的都是shell(默認為bash)
當然#!還可以跟/usr/bin/python,/usr/bin/perl
腳本調試
bash -x 腳本路徑 調試執行,把執行成功的結果顯示,不成功的報錯
三、#!(讀shabang)的作用詳解
先看這個Shell腳本
#!/bin/bash echo "Hello World"
當沒有#!的時候,默認/bin/bash
舉個例子加深#!的作用:
vim test.rm #!/bin/rm -f echo hello world
保存退出
ls 發現多了一個text.rm的文件
/bin/bash test.rm 結果顯示 hello world
chmod u+x test.rm ./test.rm
沒有顯示任何信息
ls 發現test.rm文件沒有了
總結:當運行腳本是bin/bash或/usr/bin/python或/usr/bin/perl + 腳本時,則忽略第一行#!後邊的內容,使用手動輸入的shell,結果執行例子中的echo;當運行腳本是直接腳本路徑時,test.sh調用#!後邊的命令,刪除該文件,不執行echo.
# --->後邊的內容為註釋
四、結合案例分析變量類型
局部變量
生效為僅為當前shell(即使子shell也不能)
A=123 B=$USER C=$(hostname)
echo $A echo $B echo $C
echo "$A"456
echo ${A}456
set 命令查看所有局部變量
unset + 變量名 取消指定局部變量和環境變量
案例:
1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬 盤大小
#!/bin/bash echo ipv4地址:$(ifconfig eth0 |tr "\n" " " |tr -s " " $ |cut -d$ -f7 |cut -d: -f2) echo 系統版本:$(cat /etc/redhat-release) echo 內核版本:$(uname -r) echo 內存大小:$(cat /proc/meminfo |tr "\n" $ |cut -d$ -f1 |grep -o "[0-9]*") KB echo 硬盤大小:$(fdisk -l |grep "sda\>" |cut -d: -f2 |cut -d, -f1) echo CPU型號:$(cat /proc/cpuinfo |grep "name" |sort -u |cut -d: -f2)
2、編寫腳本/root/bin/backup.sh,可實現將/etc/目錄備份到/root/etcYYYY-mm-dd中(date +%F 以年-月-日顯示日期)
#!/bin/bash cp -r /etc/ /root/etc$(date +%F)
環境變量
當前shell和子shell
如:A=mage
echo $A #顯示mage
bash #開啟當前shell的子shell
echo $A #沒有顯示內容
說明A只是一個局部變量
環境變量的聲明
export + 變量名
declare -x 變量名
查看所有環境變量
export , declare -x , env ,printenv
只讀變量
readonly 變量名 聲明只讀變量
readonly -p 查看所有只讀變量
本地變量:通常指函數
位置變量:傳遞參數
$1,$2,... 對應的1等,2等參數
set -- 清空所有位置變量
五、特殊變量及其$@ $*的區別
特殊變量
$? 上個命令的退出狀態
$0 當前腳本的文件名
$* 傳遞給腳本或函數的所有參數(當做一個整體的字符)
$@ 傳遞給腳本或函數的所有參數(每個參數作為一個獨立的字符)
$# 傳遞給腳本或函數的參數個數
$$ 當前Shell進程ID
如:
vim test.sh echo $1 echo $2 echo $3 echo $# /bin/bash ./test.sh 4 5 6 7
結果顯示:4 5 6 4(7多余;共輸入了4個參數)
$@ $*的區別
都表示傳遞給函數或腳本的所有參數,但是當它們被雙引號(" ")包含時,"$*" 會將所有的參數作為一個整體;"$@" 會將各個參數分開
寫兩個腳本實驗$*,$@的區別:
vim b.sh #!/bin/bash echo '$@是' $1
保存退出
vim a.sh #!/bin/bash echo '$*是' $* /app/b.sh $@
保存退出
chmod +x a.sh b.sh ./a.sh {a..z}
結果顯示:
$*是 a b c d e f g h i j k l m n o p q r s t u v w x y z $@是 a
六、退出狀態
所謂退出狀態,就是上一個命令執行後的返回結果。
0 代表成功 1-255 代表失敗(不同類型)
$? 保存最近的命令的退出狀態,命令執行成功就為0,失敗就為1-255
小tip:我們可以把變量$?用在判斷語句中
exit [n] 自定義退出狀態碼
腳本一旦運行到exit [n],當前shell就會退出,並把n賦值給$?
六、算數運算
+ - * / %(取余) **(乘方)
實現算數運算方法:
(1) let var=算術表達式
(2) var=$[算術表達式]
(3) var=$((算術表達式))
(4) declare –i var= 算數表達式
(5) echo '算術表達式' | bc
隨機數生成器:$RANDOM(0-32767)---- 相當於一個算數表達式
echo $[$RANDOM%50] :0-49之間隨機數
七、test和[ expression ]判斷
test + expression
=或者== 判斷兩個字符是否相等,並不能判斷數字是否相等
!= 判斷兩個字符不相等
> 判斷兩個字符大於
< 判斷兩個字符大於(按照ASCII碼大小)
=~ 判斷兩個字符是否匹配 (常用於[[ ]]中,支持擴展正則表達式,兩個字符最好用""括起來)
-eq 判斷兩個數值是否相等(equal)
-ne 判斷兩個數值不等(not equal)
-gt 判斷兩個數值大於(greater than)
-ge 判斷兩個數值大於等於(greater equal)
-lt 判斷兩個數值小於(less than)
-le 判斷兩個數值小於等於(less equal)
[ expression ]
註意:[ 後邊的空格和 ] 前面的空格,必須要有,其實 [ 是一個命令,位於/usr/bin/目錄下
-f 判斷是否是普通文件
-d 判斷是否是目錄
-x 判斷是否有執行權限
-z 判斷字符是否為空
-n 判斷字符是否為不空
test和 [ ] 通用
linux學習—shell腳本知識點總結