Linux的Shell編程語法集錦
【GiantPandaCV導(dǎo)語】相信在linux服務(wù)器環(huán)境下完成算法開發(fā)和部署的同學(xué),都有使用shell來實現(xiàn)部分自動化功能的經(jīng)歷,本文就來給大家分享我總結(jié)的一些shell語法知識,希望對大家有幫助。
一、shell文件運行
寫好的文件保存為*.sh 文件加好運行權(quán)限后,就是可以用Bash運行的腳本程序了
chmod +x yourshell.sh
./yourshell.sh
二、shell 變量
命名格式 A=B 或用循環(huán)等語句給變量賦值
注意:變量名和等號之間不能有空格
使用時:echo $A或 echo ${A},花括號用來確認變量范圍(可選)
只讀變量:A=B readonly A
刪除變量:unset A
變量類型:
1)局部變量 僅當前shell實例中有效
2)環(huán)境變量 全局的變量,比如用export聲明的,或者在bashrc文件里或者/etc/profile文件里的
3)shell變量 由shell程序設(shè)置的特殊變量
shell 字符串
A='B' 或 A="B"
注意:單引號中的變量是無效的,雙引號中的可使用轉(zhuǎn)義字符
字符串拼接 A=B C="D,""
{A}"
獲取字符串長度 A=B echo ${#A}
提取子串 A=B echo ${A:1:4}
查找子串 A=B 此處的是反引號不是單引號 echo
expr index "$A"
shell 數(shù)組
bash僅支持一維數(shù)組 A=(B C D E F) 或A[0]=B A[1]=E A[3]=F 可以不使用連續(xù)下標 讀取 {A[@]} 表示獲取所有元素
shell 傳遞參數(shù)
$0 腳本名 9 輸入腳本的參數(shù),第一個、第二個以此類推 $@ 所有的參數(shù) $# 參數(shù)數(shù)量 $?返回上一條指令的代碼 $_最后一條指令的最后一個參數(shù)
三、shell 基礎(chǔ)運算符
算數(shù)運算符shell原生不支持數(shù)學(xué)計算,可通過awk或expr實現(xiàn),或者使用(()),在內(nèi)層小括號內(nèi),使用C的語法實現(xiàn)。使用expr時,`為反引號而不是單引號
val=`expr 2 + 2`
注意:表達式和運算符之間必須有空格,條件表達式要放在方括號內(nèi),例如[b],乘號前必須加反斜杠
關(guān)系運算符
注意:只支持數(shù)字,不支持字符串,除非字符串的值是數(shù)字
-eq 是否相等
-ne 是否不相等
-gt 左邊是否大于右邊
-lt 左邊是否小于右邊
-ge 左邊是否大于等于右邊
-le 左邊是否小于等于右邊
布爾運算符
! 非
-o 或
-a 與
邏輯運算符
&& 邏輯的AND
|| 邏輯的OR
字符運算符
= 相等
!= 不相等
-z 長度為0
-n 不為0長度
$ 是否為空
文件測試運算符
文件測試運算符用于檢測 Unix 文件的各種屬性。
-b file 檢測文件是否是塊設(shè)備文件,如果是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測文件是否是字符設(shè)備文件,如果是,則返回 true。 [ -c $file ] 返回 false。
-d file 檢測文件是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測文件是否是普通文件(既不是目錄,也不是設(shè)備文件),如果是,則返回 true。 [ -f $file ] 返回 true。
-g file 檢測文件是否設(shè)置了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
-k file 檢測文件是否設(shè)置了粘著位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。
-p file 檢測文件是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。
-u file 檢測文件是否設(shè)置了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
-r file 檢測文件是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
-w file 檢測文件是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。
-x file 檢測文件是否可執(zhí)行,如果是,則返回 true。 [ -x $file ] 返回 true。
-s file 檢測文件是否為空(文件大小是否大于0),不為空返回 true。 [ -s $file ] 返回 true。
-e file 檢測文件(包括目錄)是否存在,如果是,則返回 true。 [ -e $file ] 返回 true。
四、shell echo
read name 類似python的input函數(shù),可以用來獲取輸入值echo -e "ok! \n" -e 開啟轉(zhuǎn)義\c 不換行\(zhòng)n 換行
五、shell printf
語法printf format-string [arguments...]舉例:printf "test\n"
六、shell test
用于檢查某個條件是否成立,可進行數(shù)值、字符和文件三方面的測試數(shù)值測試-eq 等于則為真-ne 不等于則為真-gt 大于則為真-ge 大于等于則為真-lt 小于則為真-le 小于等于則為真num1=100num2=100if test $[num1] -eq $[num2]then echo '兩個數(shù)相等!'else echo '兩個數(shù)不相等!'fi代碼內(nèi)的[]中可進行基本的數(shù)值運算字符串測試= 等于則為真!= 不相等則為真-z 字符串 字符串的長度為零則為真-n 字符串 字符串的長度不為零則為真num1="alasijia"num2="alasi1jia"if test $num1 = $num2then echo '兩個字符串相等!'else echo '兩個字符串不相等!'fi文件測試-e 文件名 如果文件存在則為真-r 文件名 如果文件存在且可讀則為真-w 文件名 如果文件存在且可寫則為真-x 文件名 如果文件存在且可執(zhí)行則為真-s 文件名 如果文件存在且至少有一個字符則為真-d 文件名 如果文件存在且為目錄則為真-f 文件名 如果文件存在且為普通文件則為真-c 文件名 如果文件存在且為字符型特殊文件則為真-b 文件名 如果文件存在且為塊特殊文件則為真cd /binif test -e ./bashthen echo '文件已存在!'else echo '文件不存在!'fi
七、shell 流程控制
if conditionthen commandelsefiif conditionthen commandelif condition2then commandelse commandfifor var in item1 item2do commanddonewhile conditiondo command done
八、函數(shù)
[function] funname[()]{ action; [return int;]}fun(){action}
九、當前腳本包含其他腳本
source tesh.sh 或 . tesh.sh
十、shell中雙括號,雙中括號的含義
詳見:https://www.jb51.net/article/123081.htm
十一、示例demo
這里引用MIT課程里的一個腳本,該課程名稱為《The Missing Semester of Your CS Education》大家可以上網(wǎng)搜索的到,加上注釋幫助大家理解
#!/bin/bash echo $(ls) # 執(zhí)行l(wèi)s命令并打印執(zhí)行結(jié)果,這里就是打印當前文件夾下的所有文件echo "Starting program at $(date)" # 這句會首先執(zhí)行data指令來獲取當前時間信息并將該信息重定向到當前語句,再打印輸出echo "Running program $0 with $# arguments with pid $$" # 此處的$0會重定向為腳本名,$#會重定向為當前參數(shù)數(shù)量 $$為當前執(zhí)行腳本的進程標識號# 此處就是一個for循環(huán),一個一個的拿出調(diào)用腳本時傳入的參數(shù)for file in "$@"; do grep foobar "$file" > /dev/null 2> /dev/null # 這里的grep函數(shù)是有返回值的,這里的意思是,返回有或者無時重定向到指定位置,無該文件時重定向到另一指定位置 # 這里要注意,中括號和里面的執(zhí)行指令之間一定要有空格 if [[ $? -ne 0 ]]; then echo "File $file does not have any foobar, adding one" echo "# foobar" >> "$file" fi done
- END -
歡迎添加微信加入交流群~
