shell 指令集锦
0 shell簡介
Shell 是一個用 C 語言編寫的程序,它是用戶使用 Linux 的橋梁。
Shell 既是一種命令語言,又是一種程序設計語言。
Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。
0.1 執行shell
方法1:作為可執行程序
保存為 test.sh,并 cd 到相應目錄:
chmod +x ./test.sh #使腳本具有執行權限 ./test.sh #執行腳本注意,一定要寫成?./test.sh,而不是?test.sh
方法2:作為解釋器參數
直接運行解釋器,其參數就是 shell 腳本的文件名(該腳本文件可以無 "執行權限"。)
sh test.sh1 shell變量
1.1 定義變量
定義變量時,變量名不加美元符號
以下語句將 /etc 下目錄的文件名循環出來。
for file in `ls /etc` 或 for file in $(ls /etc)1.2 使用變量
使用一個定義過的變量,只要在變量名前面加美元符號即可
花括號是可選的(加花括號是為了幫助解釋器識別變量的邊界。推薦給所有變量加上花括號,這是個好的編程習慣。),但是一定要加美元符號
1.3 設置只讀變量(readonly)
1.4 刪除變量(unset)
變量被刪除后不能再次使用。
unset 命令不能刪除只讀變量。
2 shell 字符串
2.1 單引號
單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符后也不行)
但單引號可成對出現,作為字符串拼接使用。
2.2 雙引號
- 雙引號里可以有變量(變量需要$b使用)
- 雙引號里可以出現轉義字符(用echo -e顯示轉義字符)
和單引號一樣,雙引號也能拼接字符
2.3 獲取字符串長度
也可以用length
2.4 截取子字符串
2.4.1 按照下標截取
假設有變量 var=http://www.aaa.com/123.htm
| echo ${var:0:5} | ?0 表示左邊第一個字符開始,5 表示字符的總個數。 結果是:http: |
| echo ${var:7} | ?7 表示左邊第8個字符開始,一直到結束。 結果是 :www.aaa.com/123.htm |
| echo ${var:0-7:3} | 0-7 表示右邊算起第七個字符開始,3 表示字符的個數。 結果是:123 |
| echo ${var:0-7} ? | 從右邊第七個字符開始,一直到結束。 結果是:123.htm |
注:(左邊的第一個字符是用 0 表示,右邊的第一個字符用 0-1 表示)
2.4.2 #截取
#、##?表示從左邊開始刪除。
一個?#?表示從左邊刪除到第一個指定的字符;
兩個?#?表示從左邊刪除到最后一個指定的字符。
假設有變量 var=http://www.aaa.com/123.htm
| echo ${var#*//} | 從左邊開始刪除第一個 // 號及左邊的所有字符, 即刪除 http:// 結果是 :www.aaa.com/123.htm |
| echo ${var##*/} | ?表示從左邊開始刪除最后(最右邊)一個 / 號及左邊的所有字符, 即刪除 http://www.aaa.com/ 結果是 123.htm |
2.4.3 %截取
%、%%?表示從右邊開始刪除。
一個?%?表示從右邊刪除到第一個指定的字符;
兩個?%?表示從右邊刪除到最后一個指定的字符。
假設有變量 var=http://www.aaa.com/123.htm
| echo ${var%/*} | 從右邊開始,刪除第一個 / 號及右邊的字符 結果是:http://www.aaa.com |
| echo ${var%%/*} | 從右邊開始,刪除最后(最左邊)一個 / 號及右邊的字符 結果是:http: |
2.5 查找子字符串
注意,以上腳本中,`是反引號(鍵盤1左邊那個),不是單引號
3 shell數組
3.1 定義數組
在 Shell 中,用括號來表示數組,數組元素用"空格"符號分割開。定義數組的一般形式為:
數組名=(值1 值2 ... 值n)
使用不連續的下標,如果接下來要讀取沒有賦值的下標位置的數組,不會報錯,但也不會有什么返回。
3.2 讀取數組
下標可以是變量(變量前面加不加$都可以)
3.3 獲取數組所有元組
使用?@/*?符號可以獲取數組中的所有元素
3.4?獲取數組長度
獲取數組長度的方式和獲取字符串長度的方式相同
4 shell注釋
4.1 單行注釋
以?#?開頭的行就是注釋,會被解釋器忽略。
通過每一行加一個?#?號設置多行注釋
4.2?多行注釋
5 shell傳參
我們可以在執行 Shell 腳本時,向腳本傳遞參數,腳本內獲取參數的格式為:$n。
n?代表一個數字,1 為執行腳本的第一個參數,2 為執行腳本的第二個參數,以此類推……
| $# | 傳遞到腳本的參數個數 |
| $* | 以一個單字符串顯示所有向腳本傳遞的參數,以"$1 $2 … $n"的形式輸出所有參數 |
| $$ | 腳本當前的進程ID號 |
| $@ | 與$*相同,但是使用時加引號,并在引號中返回每個參數。 如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。 |
5.1 *和@的區別
$* 與 $@ 區別:
- 相同點:都是引用所有參數。
- 不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數 1、2、3,,則 " * " 等價于 "1 2 3"(傳遞了一個參數),而 "@" 等價于 "1" "2" "3"(傳遞了三個參數)。
6 shell基本運算符
注意事項:
1,表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數編程語言不一樣。
2,完整的表達式要被?` `?包含,注意這個字符不是常用的單引號,在 Esc 鍵下邊。
3,常用的 +? -? *?? /??? %?? =?? ==?? != ,shell上都有
4,乘號(*)前邊必須加反斜杠(\)才能實現乘法運算;(在 MAC 中 shell 的 expr 語法是:$((表達式)),此處表達式中的 "*" 不需要轉義符號 "\" )
5,條件表達式要放在方括號之間,并且要有空格,例如:?[$a==$b]?是錯誤的,必須寫成?[ $a == $b ]。
6.1 shell關系運算符
| -eq | 判斷是否相等 (equal) |
| -ne | 判斷是否不相等 (not equal) |
| -gt | 判斷是否大于 (greater than) |
| -lt | 判斷是否小于 (less than) |
| -ge | 判斷是否大于等于 (greater equal) |
| -le | 判斷是否小于等于 (less equal) |
6.2 shell布爾運算符
| ! | 非 |
| -o | 或運算(or) |
| -a | 與運算(and) |
6.3?字符串運算符
| = | 兩個字符串是否相等 |
| != | 判斷兩個字符串是否不相等 |
| -z | 字符串長度是否為0(為0返回true) |
| -n | 字符串長度是否不為0(不為0返回true) |
6.4 shell邏輯運算符
| && | 邏輯的 AND |
| || | 邏輯的 OR |
?
6.5 文件測試運算符
| -d file | 檢測文件是否是目錄,如果是,則返回 true。 | [ -d $file ] 返回 false。 |
| -f file | 檢測文件是否是普通文件,如果是,則返回 true。 | [ -f $file ] 返回?true。 |
| -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。 |
7 shell echo 命令
7.1 顯示普通字符
7.2?顯示雙引號
7.3 -e 開啟轉義
7.4?顯示結果定向至某文件
7.5?顯示命令執行結果
8 shell 流程控制
和一般的語言不一樣,shell的流程控制不可為空,也就是說,如果else分支沒有語句可以執行,那么就不要寫這個else?
要注意的是,和 C 語言不同,shell 語言中 0 代表 true,0 以外的值代表 false。
8.1 if-else
8.2 if-elif-else
8.3 for
8.4 while
幾種自增的方法
let j++let "n++"let m+=1a=$[$a+1]8.5 until
一直循環,直到某一次條件為true
8.6 case
每個 case 分支用右圓括號開始,用兩個分號?;;?表示 break,即執行結束,跳出整個 case ... esac 語句。
取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令后不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行后面的命令。
8.7 跳出循環
shell中也有break和continue
9 shell 重定向
| command > file | 將輸出重定向到file |
| command < file | 將輸入重定向到file |
| command >> file | 將輸出以追加(append)的方式重定向到file |
| n > file | 將文件描述符為n的文件重定向到file |
| n >> file | 將文件描述符為n的文件以追加的方式重定向到file |
| n >& m | 將輸出文件m和n合并 |
9.1 文件描述符
| 0 | 標準輸入 STDIN |
| 1 | 標準輸出 STDOUT |
| 2 | 標準錯誤輸出 STDERR |
9.2 舉例
將 stdout 和 stderr 合并后重定向到 file
10 printf
printf 命令模仿 C 程序庫(library)里的 printf() 程序
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg printf "%-10s %-8s %-4.2f\n" 小趙 男 66.1234 printf "%-10s %-8s %-4.2f\n" 小錢 男 48.6543 printf "%-10s %-8s %-4.2f\n" 小孫 女 47.9876%s %c %d %f?都是格式替代符
%s?輸出一個字符串(string)
%d?整型輸出(decimal)
%c?輸出一個字符(char)
%f?輸出浮點數。(float)
%-10s?指一個寬度為 10 個字符(-?表示左對齊,沒有則表示右對齊),任何字符都會被顯示在 10 個字符寬的字符內,如果不足則自動以空格填充,超過也會將內容全部顯示出來。
%-4.2f?指格式化為小數,其中?.2?指保留2位小數。
?
format-string 單引號雙引號效果一樣。
如果format-string中只有一個,甚至沒有引號都可以
格式只指定了一個參數,但多出的參數仍然會按照該格式輸出,format-string 被重用
如果沒有 arguments,那么 %s 用NULL代替,%d 用 0 代替
格式化浮點數默認支持小數點后面六位,多出來的四舍五入
10.1 printf 轉義序列
大體上和C是一樣的
| \b | 后退 |
| \c | 抑制(不顯示)輸出結果中任何結尾的換行字符 |
| \f | 換頁(formfeed) |
| \n | 換行 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \\ | 一個字面上的反斜杠字符 |
| \ddd | 表示1到3位數八進制值的字符。僅在格式字符串中有效 |
| \0ddd | 表示1到3位的八進制值字符,開頭有一個0 |
11 shell函數
linux shell 可以用戶定義函數,然后在shell腳本中可以隨便調用。
11.1 函數定義
shell中函數的定義格式如下:
- 1、可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數。
- 2、參數返回,可以顯示加:return 返回,如果不加,將以最后一條命令運行結果,作為返回值。 return后跟數值n(0-255)
下面定義一個帶有return語句的函數:
funWithReturn(){echo "這個函數會對輸入的兩個數字進行相加運算..."echo "輸入第一個數字: "read aNumecho "輸入第二個數字: "read anotherNumecho "兩個數字分別為 $aNum 和 $anotherNum !"return $(($aNum+$anotherNum)) }那么我們怎么得到函數返回的值呢?使用$? 即可
$??僅對其上一條指令負責,一旦函數返回后其返回值沒有立即保存入參數,那么其返回值將不再能通過?$??獲得。
11.2 函數參數
在Shell中,調用函數時可以向其傳遞參數。
在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數...
funWithParam(){echo "第一個參數為 $1 !"echo "第二個參數為 $2 !"echo "第十個參數為 $10 !"echo "第十個參數為 ${10} !"echo "第十一個參數為 ${11} !"echo "參數總數有 $# 個!"echo "作為一個字符串輸出所有參數 $* !" }注意,$10 不能獲取第十個參數,獲取第十個參數需要${10}。當n>=10時,需要使用${n}來獲取參數。
還有幾個特殊的參數,和第五節shell傳參是一樣的
| $# | 傳遞到腳本的參數個數 |
| $* | 以一個單字符串顯示所有向腳本傳遞的參數,以"$1 $2 … $n"的形式輸出所有參數 |
| $$ | 腳本當前的進程ID號 |
| $@ | 與$*相同,但是使用時加引號,并在引號中返回每個參數。 如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。 |
?
總結
以上是生活随笔為你收集整理的shell 指令集锦的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件使用: word
- 下一篇: 软件使用 excel