Linux 的 Shell 編程語法集錦
【GiantPandaCV 導語】相信在 linux 服務器環境下完成算法開發和部署的同學,都有使用 shell 來實現部分自動化功能的經歷,本文就來給大家分享我總結的一些 shell 語法知識,希望對大家有幫助。
一、shell 文件運行
寫好的文件保存爲 *.sh 文件加好運行權限後,就是可以用 Bash 運行的腳本程序了
chmod +x yourshell.sh
./yourshell.sh
二、shell 變量
命名格式 A=B 或用循環等語句給變量賦值
注意:變量名和等號之間不能有空格
使用時:echo $A或 echo ${A},花括號用來確認變量範圍(可選)
只讀變量:A=B readonly A
刪除變量:unset A
變量類型:
1)局部變量 僅當前 shell 實例中有效
2)環境變量 全局的變量,比如用 export 聲明的,或者在 bashrc 文件裏或者 / etc/profile 文件裏的
3)shell 變量 由 shell 程序設置的特殊變量
shell 字符串
A='B' 或 A="B"
注意:單引號中的變量是無效的,雙引號中的可使用轉義字符
字符串拼接 A=B C="D,"" A"E="F, {A}"
獲取字符串長度 A=B echo ${#A}
提取子串 A=B echo ${A:1:4}
查找子串 A=B 此處的是反引號不是單引號 echo
expr index "$A"
shell 數組
bash 僅支持一維數組 A=(B C D E F) 或 A[0]=B A[1]=E A[3]=F 可以不使用連續下標 讀取 A|i|{A[@]}
表示獲取所有元素
shell 傳遞參數
-
$0 腳本名
-
1-9 輸入腳本的參數,第一個、第二個以此類推
-
$@ 所有的參數
-
$# 參數數量
-
$?返回上一條指令的代碼
-
當前腳本的進程標識號(PID)
-
$_最後一條指令的最後一個參數
三、shell 基礎運算符
算數運算符 shell 原生不支持數學計算,可通過 awk 或 expr 實現,或者使用 (()),在內層小括號內,使用 C 的語法實現。使用 expr 時,` 爲反引號而不是單引號
val=`expr 2 + 2`
注意:表達式和運算符之間必須有空格,條件表達式要放在方括號內,例如 [a==b]
,乘號前必須加反斜槓
關係運算符
注意:只支持數字,不支持字符串,除非字符串的值是數字
-eq 是否相等
-ne 是否不相等
-gt 左邊是否大於右邊
-lt 左邊是否小於右邊
-ge 左邊是否大於等於右邊
-le 左邊是否小於等於右邊
布爾運算符
! 非
-o 或
-a 與
邏輯運算符
&& 邏輯的AND
|| 邏輯的OR
字符運算符
= 相等
!= 不相等
-z 長度爲0
-n 不爲0長度
$ 是否爲空
文件測試運算符
文件測試運算符用於檢測 Unix 文件的各種屬性。
-b file 檢測文件是否是塊設備文件,如果是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測文件是否是字符設備文件,如果是,則返回 true。 [ -c $file ] 返回 false。
-d file 檢測文件是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。 [ -f $file ] 返回 true。
-g file 檢測文件是否設置了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
-k file 檢測文件是否設置了粘着位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。
-p file 檢測文件是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。
-u file 檢測文件是否設置了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
-r file 檢測文件是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
-w file 檢測文件是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。
-x file 檢測文件是否可執行,如果是,則返回 true。 [ -x $file ] 返回 true。
-s file 檢測文件是否爲空(文件大小是否大於0),不爲空返回 true。 [ -s $file ] 返回 true。
-e file 檢測文件(包括目錄)是否存在,如果是,則返回 true。 [ -e $file ] 返回 true。
四、shell echo
read name 類似python的input函數,可以用來獲取輸入值echo -e "ok! \n" -e 開啓轉義\c 不換行\n 換行
五、shell printf
語法printf format-string [arguments...]舉例:printf "test\n"
六、shell test
用於檢查某個條件是否成立,可進行數值、字符和文件三方面的測試數值測試-eq 等於則爲真-ne 不等於則爲真-gt 大於則爲真-ge 大於等於則爲真-lt 小於則爲真-le 小於等於則爲真num1=100num2=100if test $[num1] -eq $[num2]then echo '兩個數相等!'else echo '兩個數不相等!'fi代碼內的[]中可進行基本的數值運算字符串測試= 等於則爲真!= 不相等則爲真-z 字符串 字符串的長度爲零則爲真-n 字符串 字符串的長度不爲零則爲真num1="alasijia"num2="alasi1jia"if test $num1 = $num2then echo '兩個字符串相等!'else echo '兩個字符串不相等!'fi文件測試-e 文件名 如果文件存在則爲真-r 文件名 如果文件存在且可讀則爲真-w 文件名 如果文件存在且可寫則爲真-x 文件名 如果文件存在且可執行則爲真-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
八、函數
[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》大家可以上網搜索的到,加上註釋幫助大家理解
#!/bin/bash echo $(ls) # 執行ls命令並打印執行結果,這裏就是打印當前文件夾下的所有文件echo "Starting program at $(date)" # 這句會首先執行data指令來獲取當前時間信息並將該信息重定向到當前語句,再打印輸出echo "Running program $0 with $# arguments with pid $$" # 此處的$0會重定向爲腳本名,$#會重定向爲當前參數數量 $$爲當前執行腳本的進程標識號# 此處就是一個for循環,一個一個的拿出調用腳本時傳入的參數for file in "$@"; do grep foobar "$file" > /dev/null 2> /dev/null # 這裏的grep函數是有返回值的,這裏的意思是,返回有或者無時重定向到指定位置,無該文件時重定向到另一指定位置 # 這裏要注意,中括號和裏面的執行指令之間一定要有空格 if [[ $? -ne 0 ]]; then echo "File $file does not have any foobar, adding one" echo "# foobar" >> "$file" fi done
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/uwigorutKHsDHxYwh9ieug