什麼是腳本?前端
腳本簡單地說就是一條條的文字命令(一些指令的堆積),這些文字命令是能夠看到的(如能夠用記事本打開查看、編輯)。python
常見的腳本: JavaScript(JS,前端),VBScript, ASP,JSP,PHP(後端),SQL(數據庫操做語言),Perl,Shell,python,Ruby,JavaFX, Lua等。正則表達式
爲何要學習和使用shell?shell
Shell屬於內置的腳本數據庫
程序開發的效率很是高,依賴於功能強大的命令能夠迅速地完成開發任務(批處理)編程
語法簡單,代碼寫起來比較輕鬆,簡單易學vim
Shell 是一個 C 語言編寫的腳本語言,它是用戶與 Linux 的橋樑,用戶輸入命令交給 Shell 處理, Shell 將相應的操做傳遞給內核(Kernel),內核把處理的結果輸出給用戶。後端
下面是流程示意圖:bash
Shell 既然是工做在 Linux 內核之上,那咱們也有必要了解下 Linux 相關知識。 Linux 是一套免費試用和自由傳播的類 Unix 操做系統,是一個基於 POSIX 和 UNIX 的多用戶、多任 務、支持多線程和多 CPU 的操做系統。多線程
1983 年 9 月 27 日,Richard Stallman(理查德-馬修-斯托曼)發起 GNU 計劃,它的目標是建立一 套徹底自由的操做系統。爲保證 GNU 軟件能夠自由的使用、複製、修改和發佈,全部的 GNU 軟件都 有一份在禁止其餘人添加任何限制的狀況下受權全部權利給任何人的協議條款,GNU 通用公共許可 證(GNU General Plubic License,GPL),說白了就是不能作商業用途。
GNU 是」GNU is Not Unix」的遞歸縮寫。UNIX 是一種普遍使用的商業操做系統的名稱。
1985 年,Richard Stallman 又創立了自由軟件基金會(Free Software Foundation,FSF)來爲 GNU 計劃提供技術、法律以及財政支持。
1990 年,GNU 計劃開發主要項目有 Emacs(文本編輯器)、GCC(GNU Compiler Collection,GNU 編 譯器集合)、Bash 等,GCC 是一套 GNU 開發的編程語言編譯器。還有開發一些 UNIX 系統的程序庫和 工具。
1991 年,Linuxs Torvalds(林納斯- 託瓦茲)開發出了與 UNIX 兼容的 Linux 操做系統內核並在 GPL 條款下發布。
1992 年,Linux 與其餘 GUN 軟件結合,徹底自由的 GUN/Linux 操做系統正式誕生,簡稱 Linux。
1995 年 1 月,Bob Young 創辦 ACC 公司,以 GNU/Linux 爲核心,開發出了 RedHat Linux 商業版。
Linux 基本思想有兩點:第一,一切都是文件;第二,每一個軟件都有肯定的用途。
與 Unix 思想十分 相近。 Kernel Shell 命令 用戶 解析命令 並傳遞給內核 執行動做
GUI 爲 Unix 或者類 Unix 操做系統構造一個功能完善、操做簡單以及界面友好的桌面環境。主流桌 面環境有 KDE,Gnome 等。
CLI 是在用戶提示符下鍵入可執行指令的界面,用戶經過鍵盤輸入指令,完成一系列操做。 在 Linux 系統上主流的 CLI 實現是 Bash,是許多 Linux 發行版默認的 Shell。還有許多 Unix 上 Shell,例如 tcsh、csh、ash、bsh、ksh 等。
Shell 是一個程序,通常都是放在/bin或者/user/bin目錄下,當前 Linux 系統可用的 Shell 都記錄在/etc/shells文件中。/etc/shells是一個純文本文件,你能夠在圖形界面下打開它,也可使用 cat 命令查看它。
經過 cat 命令來查看當前 Linux 系統的可用 Shell:
在現代的 Linux 上,sh 已經被 bash 代替,/bin/sh每每是指向/bin/bash的符號連接。
若是你但願查看當前 Linux 的默認 Shell,那麼能夠輸出 SHELL 環境變量:
輸出結果代表默認的 Shell 是 bash。
SHELL是 Linux 系統中的環境變量,它指明瞭當前使用的 Shell 程序的位置,也就是使用的哪一個 Shell。
主要講解在大多 Linux 發行版下默認 Bash Shell。Linux 系統是 RedHat 下的 CentOS 操做系 統,徹底免費。與其商業版 RHEL(Red Hat Enterprise Linux)出自一樣的源代碼,不一樣的是 CentOS 並不包含封閉源代碼軟件和售後支持。
用 vim 打開 test.sh,編寫:
# vim test.sh #!/bin/bash echo "Hello world!"
第一行指定解釋器,第二行打印 Hello world!
寫好後,開始執行,執行 Shell 腳本有三種方法:
# 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 test.sh Hello world!
最後一句話什麼意思那?
子shell新建變量,在父shell中不會生效:
咱們可使用命令pstree查看咱們當前所處的位置
須要下載
[root@ken ~]# yum search pstree Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile ==================================================== Matched: pstree ==================================================== psmisc.x86_64 : Utilities for managing processes on your system texlive-pst-tree.noarch : Trees, using pstricks [root@ken ~]# yum install psmisc -y
使用pstree
咱們再次執行bash,就會進入到另一個子shell中
這個時候咱們在這個子shell中定義一個變量,發現能夠正確打印出來
[root@ken ~]# age=25 [root@ken ~]# echo $age 25
如今咱們退出當前的shell,即進入了當前子shell中的父shell中,再次打印咱們剛纔定義的變量
能夠發現如今已經沒法獲取到咱們剛纔定義的變量值了。
子shell繼承父shell的環境變量:
咱們把環境變量定義到profile的一個子文件中,並使用source執行該文件並生效
打開一個子shell,定義在父shell中的環境變量依然有效
反之,這種操做在子shell中操做,父shell也不能繼承
[root@ken ~]# cat /etc/profile.d/ken.sh export name=ken [root@ken ~]# source /etc/profile.d/ken.sh [root@ken ~]# echo $name ken [root@ken ~]# bash [root@ken ~]# echo $name ken
過濾來自一個文件或標準輸入匹配模式內容。
除了 grep 外,還有 egrep。egrep 是 grep 的擴展,至關於 grep -E。
Usage: grep [OPTION]... PATTERN [FILE]...
選項 | 描述 |
-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 | 打印不匹配的行 |
樣本文件內容
[root@ken ~]# cat test
dlakdlad
ad
ad
a
dFSAF
A
F
F
AS
F
f
sf
as
f
實例1:打印出全部的a不管大小寫 : -i選項
[root@ken ~]# grep -i 「a」 test
dlakdlad
ad
ad
a
dFSAF
A
AS
as
實例2:打印出全部的a不管大小寫,而且顯示該字符串所在的行 : -n選項
[root@ken ~]# grep -i -n 「a」 test
1:dlakdlad
2:ad
3:ad
4:a
5:dFSAF
6:A
9:AS
13:as
實例3:僅僅打印出全部匹配的字符串: -o選項
[root@ken ~]# grep -i -o 「a」 test
a
a
a
a
a
A
A
A
a
實例4:打印出匹配的字符串有多少行 -c選項
[root@ken ~]# grep -i -c 「a」 test
8
實例5:打印出字符S前面的2行 -B
[root@ken ~]# grep -B 2 「S」 test
ad
a
dFSAF
—
F
F
AS
實例6:打印出字符S後面的2行 -A
[root@ken ~]# grep -A 2 「S」 test
dFSAF
A
F
—
AS
F
f
實例7:打印出字符S先後2行 -C
[root@ken ~]# grep -C 2 「S」 test
ad
a
dFSAF
A
F
F
AS
F
f
實例8:打印出不包含大小s的全部行 取反 -v
[root@ken ~]# grep -i -v 「s」 test
dlakdlad
ad
ad
a
A
F
F
F
f
f
grep能夠從文件當中直接搜索某個關鍵詞
也能夠從標準輸入裏面搜錯
[root@ken ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@ken ~]# cat /etc/passwd | grep 「root」
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
實例1:獲取6位隨機加密數
[root@ken ~]# echo $RANDOM | md5sum | cut -c 1-6
bb2788
[root@ken ~]# echo $RANDOM | md5sum | cut -c 1-6
45a0e0
實例2:截取指定的字符串
[root@ken ~]# echo 「abcd」 | cut -c 2
b
實例3:截取出來/etc/passwd用戶名
[root@ken ~]# cat /etc/passwd | cut -d 「:」 -f 1
root
bin
daemon
adm
lp
sync
shutdown
halt
實例4:截取出來/etc/passwd用戶的shell類型
[root@ken ~]# cat /etc/passwd | cut -d 「:」 -f 7
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
實例5:截取出來/etc/passwd用戶以及shell類型
[root@ken ~]# cat /etc/passwd | cut -d 「:」 -f 1,7
root:/bin/bash
bin:/sbin/nologin
daemon:/sbin/nologin
adm:/sbin/nologin
lp:/sbin/nologin
sync:/bin/sync
shutdown:/sbin/shutdown
halt:/sbin/halt
演示文件
[root@ken ~]# cat test
12
23
2
3
5
實例1:以數字排序 -n
[root@ken ~]# sort test
12
2
23
3
5
[root@ken ~]# sort -n test
2
3
5
12
23
實例2:降序排序
[root@ken ~]# sort -n -r test
23
12
5
3
2
實例3:降序排序並取出前3行
[root@ken ~]# sort -n -r test | head -3
23
12
5
演示文件
[root@ken ~]# cat test
12:3
23:4
2:12
3:5
5:23
實例4:以冒號爲分隔符,第二列進行數字降序排序
[root@ken ~]# cat test | sort -t 「:」 -k2 -n -r
5:23
2:12
3:5
23:4
12:3
演示文本:
[root@ken ~]# cat test
12:3
12:3
12:3
12:3
23:4
2:12
3:5
3:5
3:5
3:5
5:23
實例5:顯示行並去除重複行
[root@ken ~]# sort -u test
12:3
2:12
23:4
3:5
5:23
-c:在行首用數字表示該行出現了多少次
-u:僅僅顯示那些沒有出現重複過的行
演示文件
[root@ken ~]# cat test
12:3
12:3
12:3
12:3
23:4
2:12
3:5
3:5
3:5
3:5
5:23
實例1:統計每行出現的次數
[root@ken ~]# uniq -c test
4 12:3
1 23:4
1 2:12
4 3:5
1 5:23
實例2:演示沒有出現出重複行的數量
[root@ken ~]# uniq -u test
23:4
2:12
5:23
5,seq
實例1:
[root@ken ~]# seq 5
1
2
3
4
5
實例2:
[root@ken ~]# seq 2 5
2
3
4
5
實例3:
[root@ken ~]# seq 2 2 10 #第一個2是起始位,第二個2是步長,第三個10是終止位
2
4
6
8
10
實例4:取出100之內全部的奇數
[root@ken ~]# seq 1 2 100
1
3
5
7
9
11
13
15
17
實例5:取出100之內全部的偶數
[root@ken ~]# seq 2 2 100
2
4
6
8
10
12
14
16
6.tr命令:命令用於轉換或刪除文件中的字符
-d:刪除指定的字符串
實例1:把全部的小寫字母都轉化爲大寫字母
[root@ken ~]# echo 「daadadfaedqdac」 | tr a-z A-Z
DAADADFAEDQDAC
實例2:把全部的大寫字母都轉化爲小寫字母
[root@ken ~]# echo 「SDSDA2WZFAF」 | tr A-Z a-z
sdsda2wzfaf
實例3:刪除一行中的空格
[root@ken ~]# echo 「ada dada dada」 | tr -d 」 」adadadadada