什麼是腳本?linux
腳本簡單地說是一條條的文字命令(一些指令的堆積),這些文字命令是能夠看到的,能夠經過記事本打開和編輯正則表達式
爲何要學習和使用shellshell
shell屬於內置腳本編程
程序開發的效率很是高,依賴於功能強大的命令能夠迅速的完成開發任務(批處理)vim
語法簡單,代碼寫起來比較輕送,簡單易學數組
shell簡介bash
shell是一個C語言編寫的腳本語言,它是用戶與linux的橋樑,用戶輸入命令交給shell處理,shell將相應的操做傳遞給內核,內核把處理的結果輸出給用戶學習
Linux 基本思想有兩點:第一,一切都是文件;第二,每一個軟件都有肯定的用途。字體
shell分類this
1:圖形界面shell
GUI shell 是爲Unix或者類Unix操做系統構建的一個功能完善操做簡單以及界面友好的桌面環境。
2:命令行界面shell
CLI是在用戶提示符下鍵入可執行指令的界面,用戶經過鍵盤輸入指令,完成一系列操做。
查看shell
shell是一個程序,通常放在/bin或者/user/bin目錄下,當前linux系統可用的shell都記錄在/etc/shells文件中。/etc/shells是一個純文本文件,你能夠在圖形界面下打開它,也可使用cat命令查看他。
在如今的linux上,sh已經被bash代替,/bin/sh每每是指向/bin/bash的符號連接
若是你但願查看當期那linux的默認shell,那麼能夠輸出SHELL環境變量
$ echo $SHELL /bin/bash
輸出結果代表默認的shell是bash
SHELL是linux系統中的環境變量,他指明瞭使用的shell程序的位置,也就是使用的哪一個腳本
第一個shell腳本
用vim打開test.sh
#!/bin/bash echo "Hello world!"
第一行是指定解釋器,第二行是打印Hello World!
寫好後,有三種執行腳本的方法
方法一:直接用bash解釋器執行
# bash test.sh Hello world!
當前終端會新生成一個子 bash 去執行腳本。
方法二:添加可執行權限
# ll test.sh -rw-r--r--. 1 root root 32 Aug 18 01:07 test.sh # chmod +x test.sh # ./test.sh -bash: ./test.sh: Permission denied # chmod +x test.sh # ./test.sh Hello world!
這種方式默認根據腳本第一行指定的解釋器處理,若是沒寫以當前默認 Shell 解釋器執行。
注意,這裏在運行時必定要寫成 ./test.sh(絕對路徑亦可),而不是 test.sh,運行其它二進制的程序也同樣,直接寫 test.sh,Linux 系統會去 PATH(環境變量) 裏尋找有沒有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 裏,你的當前目錄一般不在 PATH 裏,因此寫成 test.sh 是會找不到命令的,要用 ./test.sh 告訴系統說,就在當前目錄找。
方法三:source命令執行,以當前默認shell解釋器執行
# source test.sh Hello world!
三種方法的區別:
當shell腳本具備可執行權限時,用bash與絕對路徑執行腳本是沒區別的。絕對路徑是由於當前目錄沒在PATH中,因此用"."是用來表示當前目錄的
source這個命令其實只是簡單地讀取腳本里面的語句一次在當前的shell裏面執行,沒有創建行的子shell。那麼腳本里面全部的新建、改變變量的語句都會保存在當前的shell裏面
bash從新創建一個子shell,在子shell中執行腳本里面的語句,該子shell繼承父shell的環境變量,但子shell新建的、改變的變量不會被帶回父shell
shell編程的幾個經常使用命令
grep命令詳解
過濾來自一個文件或者面準輸入匹配模式的內容
除了grep外,還有egrep。egrep是grep的擴展,至關於grep -E
grep經常使用選項
選項 | 描述 |
-E,--extended-regexp |
模式是擴展正則表達式(ERE) |
-i,--ignore-case | 忽略大小寫 |
-n,--line-number | 打印行號 |
-o,--only-matching | 只打印匹配的內容 |
-c,--count | 只打印每一個文件匹配的行數 |
-B,--before-context=NUM | 打印匹配的前幾行 |
-A,--after-context=NUM | 打印匹配的後幾行 |
-C,--context=NUM |
打印匹配的先後幾行 |
--color[=WHEN], |
匹配的字體顏色 |
-v,--invert-match |
打印不匹配的行 |
cut命令
使用說明:
cut命令從文件的每一行剪切字節,字符和字段並將這些字節,字符和字段寫至標準輸出
若是不指定file參數,cut命令將讀取標準輸入
經常使用參數:
-c:以字符爲單位進行分割
-d:自定義分隔符
-f:與-d一塊兒使用,指定顯示哪一個區域
[root@ken ~]# echo "this is ken" | cut -c 4 s
[root@ken ~]# echo 'this is ken' | cut -d' ' -f3 ken
sort命令
sort命令用於將文本內容加以排序
sort可針對文本文件的內容,以行爲單位來排序
經常使用參數說明:
* -n:依據數值的大小排序(默認是根據字符進行排序)
* -r:以相反的順序來排序
* -u:去除重複的行(只要那個指定的字段重複,就認定是重複的行)
-t:<分隔符號>指定排序時所用的欄位分割字符
-k:根據切割後的那一段進行排序
uniq命令
做用:去除重複的行(相鄰且相同,認定爲重複)
選項:
-c:在首行用數字表示該行出現了多少次
-u:僅僅顯示那些沒有出現重複過的行
seq命令
做用:生成一個數組序列
[root@ken ~]# seq 5 #終止位5 1 2 3 4 5 [root@ken ~]# seq 2 5 #起始位2,終止位5 2 3 4 5 [root@ken ~]# seq 2 2 10 #起始位2,步長爲2,終止位10 2 4 6 8 10
tr命令
做用:忽然命令用於轉換或者刪除文件中的字符
tr指令從標準輸入設備讀取數據,通過字符串轉義後,將結果輸出到標準輸出設備
a-z 任意小寫
A-Z 任意大寫
0-9 任意數字
替換實例:
[root@ken ~]# echo "this is ken" | tr a-z A-Z THIS IS KEN [root@ken ~]# echo "THIS IS KEN" | tr A-Z a-z this is ken
刪除特定字符串實例:
[root@ken ~]# cat test 6 this:is:ke3 2 this:is:ke4 2 this:is:ke4 2 this:is:ke4 2 this:is:ke4 5 this:is:ke2 6 this:is:ke1 1 this:is:ke6 8 this:is:ke7 [root@ken ~]# cat test | tr -d 's' 6 thi:i:ke3 2 thi:i:ke4 2 thi:i:ke4 2 thi:i:ke4 2 thi:i:ke4 5 thi:i:ke2 6 thi:i:ke1 1 thi:i:ke6 8 thi:i:ke7