什么是腳本?
腳本簡單地說是一條條的文字命令(一些指令的堆積),這些文字命令是可以看到的,可以通過記事本打開和編輯
為什么要學習和使用shell
shell屬於內置腳本
程序開發的效率非常高,依賴於功能強大的命令可以迅速的完成開發任務(批處理)
語法簡單,代碼寫起來比較輕送,簡單易學
shell簡介
shell是一個C語言編寫的腳本語言,它是用戶與linux的橋梁,用戶輸入命令交給shell處理,shell將相應的操作傳遞給內核,內核把處理的結果輸出給用戶
Linux 基本思想有兩點:第一,一切都是文件;第二,每個軟件都有確定的用途。
shell分類
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