一天學會shell語言,shell教程,shell簡單入門,shell中文文件
本片文章將通過8個方面來講解shell,在編寫指令碼的時候也可以把他當成是中文文件來查詢。這八個方面分別是:1,直譯器和執行shell 2,變數 3,引數傳遞 4,運算子 5,常見命令(echo printf test expr等) 6,流程控制與語法 7,函式 8,檔案包含。每一個部分我都會用表格的形式來總結出必要的知識點以便查閱。
一 直譯器與執行shell | |
用法和說明 | |
直譯器 | #!bin/sh Bourne shell版本 #!bin/bash Bourne Again Shell 版本 |
執行shell | chomd +x ./test.sh #使指令碼具有執行許可權 ./test.sh #執行指令碼 “./”表示當前目錄下 |
二 變數 | ||||
1、基本操作 | 操作 | 用法 | 舉例 | 說明 |
1 定義 | 變數名 = 變數值 | variable_name=”abc” | 無需說明資料型別,如果是數字直接寫數字1,1.1等等,如果是字串用雙引號或單引號括起來,如果是陣列就用()擴起來。不能用陣列開頭,不能有空格和標點符號,不能使用關鍵字。 | |
2 使用 | $ variable_name 或${ variable_name } | $ variable_name ${ variable_name } | 大括號可以幫助直譯器識別邊界 | |
3 只讀 | readonly variable_name | readonly variable_name | readonly 關鍵字,使用後無法修改 | |
4 刪除 | unset variable_name | unset variable_name | Unset關鍵字,使用後變數不能再被引用 | |
2、字串 | 1 拼接字串 | 直接按照變數引用方式引用,不需要加“+”號 | a = “name” b = “hello ${a}!” | 必須使用{}用來識別邊界 |
2 獲取字串長度 | “#”可以直接獲取長度 | a = “abcd” echo ${#a} | #符號是shell中用來判斷長度的符號,後面你會發先所有和長度有關的都用“#”來判斷 | |
3 查詢子字串 | Index用來查詢子字串,返回子字串開始的位置。 | string = “hello world !” Echo ` expr index “$string” world ` | “`”是反引號,不是單引號,在tab鍵上邊,expr 關鍵字是說明將後邊的內容當作表示式執行。 | |
3、陣列 | 1 定義 | 用“()”括起來,元素之間用空格隔開 | array = (val0 val1 val2 … ) | 陣列中的元素可以是多種型別,數字,字串,變數。都可以 |
2 引用 | 還是用$來引用 | 引用某一個元素 ${array[n]} | n是元素的位置,從0開始 | |
3 獲取所有元素 | 遍歷所有元素用@符號 | @符號用來遍歷所有元素,shell中許多遍歷所有內容,都會用@符號 | ||
4 獲取陣列長度 | 長度獲取用# | length = ${#array[@]} length = ${#array[*]} | *符號和@用法相似也可以用來表示所有。 | |
5 獲取單個元素長度 | 長度獲取用# | length = ${#array[n]} | n表示元素位置,從0開始 |
三 引數傳遞 | ||||
操作 | 用法 | 舉例 | 說明 | |
1、基本用法 | 引數傳遞 | Shell可以不需要形參直接傳遞引數,引數之間用空格隔開 | $ chmod +x text.sh $ ./text.sh para1 para2 para3 | 引數之間用空格隔開,沒有限制想傳多少引數傳多少 |
1 引數獲取 | $ + 數字 | Para1 = $ 0 獲取第一個引數 | $+數字直接獲取對應位置的引數 | |
2 引數個數獲取 | $ # | $ # | 獲取傳遞到指令碼的引數個數 | |
3 遍歷引數 | $ * $ @ | $ *或$ @ | 將所有引數以一個字串顯示出來 | |
4 獲取當前執行指令碼ID | $ $ | $ $ | 獲取當前執行指令碼ID | |
5 獲取後臺最後執行指令碼的ID | $ ! | 獲取後臺最後執行指令碼的ID | ||
6 顯示選項 | $ - | $ - | 顯示shell使用的當前選項,與set命令相同 | |
7 顯示推出狀態 | $ ? | $ ? | 顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤 |
四 運算子 | ||||
操作 | 用法 | 舉例 | 說明 | |
1、expr | 表示式計算工具 | 必須用“·”反引號括起來 | val=`expr 2+2` | expr 說明後面的表示式可以用運算子計算結果。 |
2、基本運算子 | + - * / % = == != | 與expr一起使用 | val=`expr 2+2` | = 賦值 == 等於 |
3、關係運算符 | 1 是否相等 | -eq | [ $a -eq $b ] 返回 false | 關係運算符只支援數字,不支援字串,除非字串的值是數字。 |
2 是否不等 | -ne | [ $a -ne $b ] 返回 true | ||
3 是否大於 | -gt | [ $a -gt $b ] 返回 false | ||
4 是否小於 | -lt | [ $a -lt $b ] 返回 true | ||
5 是否大於等於 | -ge | [ $a -ge $b ] 返回 false | ||
6 是否小於等於 | -le | [ $a -le $b ] 返回 true | ||
4、布林運算子 | 1 非 | ! | [ ! false ] 返回 true | 表示式通常寫在 [ ] 中括號內。 |
2 或 | -o | [ $a -lt 20 -o $b -gt 100 ] 返回 true | ||
3 與 | -a | [ $a -lt 20 -a $b -gt 100 ] 返回 false | ||
5、邏輯運算子 | 1 與 | && | [[ $a -lt 100 && $b -gt 100 ]] 返回 false | 邏輯運算子表示式通常在 [[ ]] 雙中括號內。 |
2 或 | || | [[ $a -lt 100 || $b -gt 100 ]] 返回 true | ||
6、字串運算子 | 1 相等 | = | [ $a = $b ] 返回 false | 假定變數 a 為 "abc",變數 b 為 "efg" |
2 不等 | != | [ $a != $b ] 返回 true | ||
3 長度是否為0 | -z | [ -z $a ] 返回 false | ||
4 長度是否不為 0 | -n | [ -n "$a" ] 返回 true | ||
5 是否為空 | string直接引用 | [ $a ] 返回 true | ||
7、檔案測試運算子 | 1是否是塊裝置檔案 | -b file | [ -b $file ] 返回 false | file="/var/www/runoob/test.sh",它的大小為100位元組,具有 rwx 許可權 |
2是否是字元裝置檔案 | -c file | [ -c $file ] 返回 false | ||
3是否是目錄 | -d file | [ -d $file ] 返回 false | ||
4是否是普通檔案(既不是目錄,也不是裝置檔案) | -f file | [ -f $file ] 返回 true | ||
5是否設定了 SGID 位 | -g file | [ -g $file ] 返回 false | ||
6是否設定了粘著位(Sticky Bit) | -k file | [ -k $file ] 返回 false | ||
7是否是有名管道 | -p file | [ -p $file ] 返回 false | ||
8是否設定了SUID位 | -u file | [ -u $file ] 返回 false | ||
9 是否可讀 | -r file | [ -r $file ] 返回 true | ||
10是否可寫 | -w file | [ -w $file ] 返回 true | ||
11是否可執行 | -x file | [ -x $file ] 返回 true | ||
12是否為空(檔案大小是否大於0) | -s file | [ -s $file ] 返回 true | ||
13檔案(包括目錄)是否存在 | -e file | [ -e $file ] 返回 true |
五 常見命令(echo printf test expr) | ||||
操作 | 用法 | 舉例 | 說明 | |
1、echo | 用來顯示字串 | echo | -e 開啟轉義 echo -e “ok! \n” \n 表示換行 Echo -e “ok! \c” \c 表示不換行 | 用於一般的字串輸出 |
2 printf | 用來列印輸出 | printf | printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 | “-”表示左對齊,沒有表示右對齊,10表示字元寬度,s表示顯示字串,4.2f表示4位float數字保留兩位小數。 |
3 test | 檢查某個條件是否成立 | test | If test -e ./bush then echo “檔案存在” else echo “檔案不存在” fi | Test和“[ ]”用法相似 |
4 expr | 表示式計算工具 | expr `表示式` | a = expr `2+2` | expr 說明後面的表示式可以用運算子計算結果。 |
六 流程控制和語法 | ||||
操作 | 用法 | 舉例 | 說明 | |
1 If | If語句 | If condition Then command1 fi | a=10 b=20 if [ $a == $b ] then echo "a 等於 b" elif [ $a -gt $b ] then echo "a 大於 b" elif [ $a -lt $b ] then echo "a 小於 b" else echo "沒有符合的條件" fi | Shell的流程控制通常會有結束語句,一般為倒寫關鍵字 |
If else語句 | If condition Then command1 else command2 fi | |||
If elif else | if condition1 then command1 elif condition2 then command2 else commandN fi | |||
2 for | for in do done | for var in item1 item2 ... itemN do command1 command2 ... commandN done | for loop in 1 2 3 4 5 do echo "The value is: $loop" done | 關鍵字in代表迴圈條件,同樣也有結束語句關鍵字done |
3 while | while do down | while condition do command done | int=1 while(( $int<=5 )) do echo $int let "int++" done | While 後面條件為空 while : 或者條件為true時 while true |
4 until | until do done | until condition do command done | a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done | until 也是迴圈控制語句,不過條件返回為true時才停止迴圈 |
5 case | case in 模式1) 模式2) esac | case 值 in 模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN; esac | echo '輸入 1 到 4 之間的數字:' echo '你輸入的數字為:' read aNum case $aNum in 1) echo '你選擇了 1' 2) echo '你選擇了 2' 3) echo '你選擇了 3' 4) echo '你選擇了 4' *) echo '你沒有輸入 1 到 4 之間的數字'; esac | 取值後面必須為單詞in,每一模式必須以右括號結束。取值可以為變數或常數。匹配發現取值符合某一模式後,其間所有命令開始執行直至 ;;。 取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令後不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行後面的命令。 |
6 break | 跳出所有迴圈,終止後面所有的操作。 | break | while : do echo -n "輸入 1 到 5 之間的數字:" read aNum case $aNum in 1|2|3|4|5) echo "你輸入的數字為 $aNum!"; *) echo "你輸入的數字不是 1 到 5 之間的! 遊戲結束" break ;; esac done | break,從這裡開始中止後邊所有的迴圈操作。 |
7 continue | 跳出本次迴圈,進入下一個迴圈條件 | continue | while : do echo -n "輸入 1 到 5 之間的數字: " read aNum case $aNum in 1|2|3|4|5) echo "你輸入的數字為 $aNum!" ;; *) echo "你輸入的數字不是 1 到 5 之間的!" continue echo "遊戲結束" ;; esac done | continue命令與break命令類似,只有一點差別,它不會跳出所有迴圈,僅僅跳出當前迴圈 |
七 函式 | ||||
1 函式 | [function] funname [()] { action; [return int;] } “[ ]”方括號中的是可選選項,可以寫也可以不寫。如果不加return 函式還是會返回最後一條的命令結果的。 | [function] funname [()] { action; [return int;] | demoFun(){ echo "這是我的第一個 shell 函式!" } echo "-----函式開始執行-----" demoFun echo "-----函式執行完畢-----" | 1、可以帶function fun() 定義,也可以直接fun() 定義,不帶任何引數。 2、引數返回,可以顯示加:return 返回,如果不加,將以最後一條命令執行結果,作為返回值。 return後跟數值n(0-255 |
八 檔案包含 | ||||
1 檔案包含 | . filename # 注意點號(.)和檔名中間有一空格 或 source filename | . filename source filename | #使用 . 號來引用test1.sh 檔案 . ./test1.sh # 或者使用以下包含檔案程式碼 # source ./test1.sh | 和java引入類,python匯入模組差不多。Shell也可以引入檔案直接使用被引入檔案中的變數和函式。 |