shell學習1

什麼是腳本?前端

腳本簡單地說就是一條條的文字命令(一些指令的堆積),這些文字命令是能夠看到的(如能夠用記事本打開查看、編輯)。python

常見的腳本: JavaScript(JS,前端),VBScript, ASP,JSP,PHP(後端),SQL(數據庫操做語言),Perl,Shell,python,Ruby,JavaFX, Lua等。正則表達式

 

爲何要學習和使用shell?shell

Shell屬於內置的腳本數據庫

程序開發的效率很是高,依賴於功能強大的命令能夠迅速地完成開發任務(批處理)編程

語法簡單,代碼寫起來比較輕鬆,簡單易學vim

 

1.1  Shell 簡介

 

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 命令 用戶 解析命令 並傳遞給內核 執行動做

1.2  Shell 分類

 

1.2.1  圖形界面 Shell(GUI Shell)

GUI 爲 Unix 或者類 Unix 操做系統構造一個功能完善、操做簡單以及界面友好的桌面環境。主流桌 面環境有 KDE,Gnome 等。

 

1.2.2  命令行界面 Shell(CLI Shell)

CLI 是在用戶提示符下鍵入可執行指令的界面,用戶經過鍵盤輸入指令,完成一系列操做。 在 Linux 系統上主流的 CLI 實現是 Bash,是許多 Linux 發行版默認的 Shell。還有許多 Unix 上 Shell,例如 tcsh、csh、ash、bsh、ksh 等。

 

1.3  查看shell

 

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。

 

1.4 第一個 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 腳本有三種方法:

 

方法 1:直接用 bash 解釋器執行

# bash test.sh
Hello world!

當前終端會新生成一個子 bash 去執行腳本。

 

方法 2:添加可執行權限

複製代碼
 # 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 告訴系統說,就在當前目錄找。

 

方法 3:source 命令執行,以當前默認 Shell 解釋器執行

# source test.sh
Hello world!

source filename 與 bash filename 及./filename執行腳本的區別

 

  • 當shell腳本具備可執行權限時,用bash filename與./filename執行腳本是沒有區別得。./filename是由於當前目錄沒有在PATH中,因此」.」是用來表示當前目錄的。
  • source filename:這個命令其實只是簡單地讀取腳本里面的語句依次在當前shell裏面執行,沒有創建新的子shell。那麼腳本里面全部新建、改變變量的語句都會保存在當前shell裏面。
  • bash filename 從新創建一個子shell,在子shell中執行腳本里面的語句,該子shell繼承父shell的環境變量,但子shell新建的、改變的變量不會被帶回父shell。


最後一句話什麼意思那?

子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

 

1.5   shell編程幾個經常使用命令

 

grep命令詳解

 

過濾來自一個文件或標準輸入匹配模式內容。

除了 grep 外,還有 egrep。egrep 是 grep 的擴展,至關於 grep -E。

Usage: grep [OPTION]... PATTERN [FILE]...

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  打印不匹配的行
 

1.grep

樣本文件內容

[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

 

2.cut

  • -c :以字符爲單位進行分割。
  • -d :自定義分隔符。
  • -f :與-d一塊兒使用,指定顯示哪一個區域。

 

實例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

 

3.sort

  • -k:根據切割後的那一段進行排序
  • -n 依照數值的大小排序(默認是根據字符進行排序)。
  • -r 以相反的順序來排序。
  • -t<分隔字符> 指定排序時所用的欄位分隔字符。
  • -u:去除重複的行(只要那個指定的字段重複,就認定是重複的行)

演示文件

[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

 

4. uniq

-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

相關文章
相關標籤/搜索