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 傳遞參數

三、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