天天看點

Shell程式設計、part1

Shell程式設計、part1
Shell程式設計、part1

1.shell簡介

2. shell分類

3. 檢視shell

4. 第一個shell腳本

5. shell程式設計常用指令

5.1 grep

5.2 cut

5.3 sort

5.4 uniq

5.5 seq

5.6 tr

前言

什麼是腳本?

腳本簡單地說就是一條條的文字指令(一些指令的堆積),這些文字指令是可以看到的(如可以用記事本打開檢視、編輯)。

常見的腳本: JavaScript(J****S****,前端),VBScript, ASP,JSP,PHP(後端),SQL(資料庫操作語言),Perl,Shell,python,Ruby,JavaFX, Lua等。

為什麼要學習和使用shell?

Shell屬于内置的腳本程式開發的效率非常高,依賴于功能強大的指令可以迅速地完成開發任務(批處理)

文法簡單,代碼寫起來比較輕松,簡單易學

1.1 Shell 簡介

Shell 是一個 C 語言編寫的腳本語言,它是使用者與 Linux 的橋梁,使用者輸入指令交給 Shell 處理, Shell 将相應的操作傳遞給核心(Kernel),核心把處理的結果輸出給使用者。

下面是流程示意圖:

Shell程式設計、part1

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 指令 使用者 解析指令 并傳遞給核心 執行動作

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檢視我們目前所處的位置

需要下載下傳

[[email protected] ~]# 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

[[email protected] ~]# yum install psmisc -y

使用pstree

我們再次執行bash,就會進入到另外一個子shell中

Shell程式設計、part1

這個時候我們在這個子shell中定義一個變量,發現可以正确列印出來

[[email protected] ~]# age=25 [[email protected] ~]# echo $age 25

現在我們退出目前的shell,即進入了目前子shell中的父shell中,再次列印我們剛才定義的變量可以發現現在已經無法擷取到我們剛才定義的變量值了。

Shell程式設計、part1

子shell繼承父shell的環境變量:

我們把環境變量定義到profile的一個子檔案中,并使用source執行該檔案并生效,打開一個子shell,定義在父shell中的環境變量依然有效,反之,這種操作在子shell中操作,父shell也不能繼承。

[[email protected] ~]# cat /etc/profile.d/ken.sh
export name=ken
[[email protected] ~]# source /etc/profile.d/ken.sh
[[email protected] ~]# echo $name
ken
[[email protected] ~]# bash
[[email protected] ~]# echo $name
ken
           

shell腳本命名

1.見名知意

  1. 結尾.sh

shell腳本編寫

#!/bin/bash                           #聲明shell解釋器
echo “Hello World”               #執行的command
           

shell腳本的運作

第一種方式:bash
[[email protected] ~]# bash hello_w.sh
Hello World
           
第二種方式:路徑方式  #要給腳本添加執行權限
[[email protected] ~]# ./hello_w.sh
-bash: ./hello_w.sh: Permission denied

[[email protected] ~]# ./hello_w.sh
-bash: ./hello_w.sh: Permission denied
[[email protected] ~]# ll
total 102412
-rw——-. 1 root root 1206 Feb 26 22:25 anaconda-ks.cfg
-rw-r–r– 1 root root 0 Mar 11 19:08 a.out
-rw-r–r– 1 root root 31 May 29 09:55 hello_w.sh
drwxr-xr-x 3 root root 80 Mar 11 18:18 ken1
lrwxrwxrwx 1 root root 4 Mar 12 11:06 test1 -> test
-rw-r–r– 1 root root 4 Mar 12 11:09 test2
-rw-r–r– 1 root root 104857600 Mar 12 18:03 test.txt
[[email protected] ~]# chmod +x hello_w.sh
[[email protected] ~]# ll
total 102412
-rw——-. 1 root root 1206 Feb 26 22:25 anaconda-ks.cfg
-rw-r–r– 1 root root 0 Mar 11 19:08 a.out
-rwxr-xr-x 1 root root 31 May 29 09:55 hello_w.sh
drwxr-xr-x 3 root root 80 Mar 11 18:18 ken1
lrwxrwxrwx 1 root root 4 Mar 12 11:06 test1 -> test
-rw-r–r– 1 root root 4 Mar 12 11:09 test2
-rw-r–r– 1 root root 104857600 Mar 12 18:03 test.txt
[[email protected] ~]# ./hello_w.sh
Hello World
           
第三步:方式
[[email protected] ~]# source hello_w.sh
Hello World
[[email protected] ~]# chmod -x hello_w.sh
[[email protected] ~]# source hello_w.sh
Hello World
           

練習1:使用root使用者帳号建立并執行test2.sh,實作建立一個shelltest使用者,并在其家目錄中建立檔案try.html。

[[email protected] ~]# cat test2.sh

#!/bin/bash
useradd shelltest
touch /home/shelltest/try.html

執行結果:
[[email protected] ~]# id shelltest
uid=1001(shelltest) gid=1001(shelltest) groups=1001(shelltest)
[[email protected] ~]# ls /home/shelltest/
try.html
           

練習2:統計目前系統總共有多少使用者

[[email protected] ~]# cat test3.sh

#!/bin/bash
wc -l /etc/passwd

執行結果:
[[email protected] ~]# bash test3.sh
22 /etc/passwd
           

練習3:統計目前已經安裝的軟體數量

[[email protected] ~]# cat test4.sh

#!/bin/bash
yum list installed | wc -l

執行結果:
[[email protected] ~]# bash test4.sh
353
           

shell腳本常用指令

1.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 列印不比對的行

樣本檔案内容

[ro[email protected] ~]# cat test
dlakdlad
ad
ad
a
dFSAF
A
F
F
AS
F
f
sf
as
f
           

執行個體1:列印出所有的a無論大小寫 : -i選項

[[email protected] ~]# grep -i “a” test

dlakdlad
ad
ad
a
dFSAF
A
AS
as
           

執行個體2:列印出所有的a無論大小寫,并且顯示該字元串所在的行 : -n選項

[[email protected] ~]# grep -i -n “a” test

1:dlakdlad
2:ad
3:ad
4:a
5:dFSAF
6:A
9:AS
13:as
           

執行個體3:僅僅列印出所有比對的字元串: -o選項

[[email protected] ~]# grep -i -o “a” test

a
a
a
a
a
A
A
A
a
           

執行個體4:列印出比對的字元串有多少行 -c選項

[[email protected] ~]# grep -i -c “a” test

8
           

執行個體5:列印出字元S前面的2行 -B

[[email protected] ~]# grep -B 2 “S” test

ad
a
dFSAF
—
F
F
AS
           

執行個體6:列印出字元S後面的2行 -A

[[email protected] ~]# grep -A 2 “S” test

dFSAF
A
F
—
AS
F
f
           

執行個體7:列印出字元S後面的2行 -C

[[email protected] ~]# grep -C 2 “S” test

ad
a
dFSAF
A
F
F
AS
F
f
           

執行個體8:列印出不包含大小s的所有行 取反 -v

[[email protected] ~]# grep -i -v “s” test

dlakdlad
ad
ad
a
A
F
F
F
f
f
           

grep可以從檔案當中直接搜尋某個關鍵詞,也可以從标準輸入裡面搜錯

[[email protected] ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] ~]# 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位随機加密數

[[email protected] ~]# echo $RANDOM | md5sum | cut -c 1-6
bb2788
[[email protected] ~]# echo $RANDOM | md5sum | cut -c 1-6
45a0e0
           

執行個體2:截取指定的字元串

[[email protected] ~]# echo “abcd” | cut -c 2
b
           

執行個體3:截取出來/etc/passwd使用者名

[[email protected] ~]# cat /etc/passwd | cut -d “:” -f 1
root
bin
daemon
adm
lp
sync
shutdown
halt
           

執行個體4:截取出來/etc/passwd使用者的shell類型

[[email protected] ~]# 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類型

[[email protected] ~]# 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:去除重複的行(隻要那個指定的字段重複,就認定是重複的行)

示範檔案

[[email protected] ~]# cat test
12
23
2
3
5

執行個體1:以數字排序 -n
[[email protected] ~]# sort test
12
2
23
3
5
[[email protected] ~]# sort -n test
2
3
5
12
23
           

執行個體2:降序排序

[[email protected] ~]# sort -n -r test
23
12
5
3
2
           

執行個體3:降序排序并取出前3行

[[email protected] ~]# sort -n -r test | head -3
23
12
5
           

示範檔案

[[email protected] ~]# cat test
12:3
23:4
2:12
3:5
5:23
           

執行個體4:以冒号為分隔符,第二列進行數字降序排序

[[email protected] ~]# cat test | sort -t “:” -k2 -n -r
5:23
2:12
3:5
23:4
12:3

示範文本:
[[email protected] ~]# 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:顯示行并去除重複行

[[email protected] ~]# sort -u test
12:3
2:12
23:4
3:5
5:23
           
  1. uniq

    -c:在行首用數字表示該行出現了多少次

    -u:僅僅顯示那些沒有出現重複過的行

示範檔案

[[email protected] ~]# 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:統計每行出現的次數

[[email protected] ~]# uniq -c test
4 12:3
1 23:4
1 2:12
4 3:5
1 5:23
           

執行個體2:示範沒有出現出重複行的數量

[[email protected] ~]# uniq -u test
23:4
2:12
5:23

5,seq
           

執行個體1:

[[email protected] ~]# seq 5
1
2
3
4
5
           

執行個體2:

[[email protected] ~]# seq 2 5
2
3
4
5
           

執行個體3:

[[email protected] ~]# seq 2 2 10  #第一個2是起始位,第二個2是步長,第三個10是終止位
2
4
6
8
10
           

執行個體4:取出100以内所有的奇數

[[email protected] ~]# seq 1 2 100
1
3
5
7
9
11
13
15
17
           

執行個體5:取出100以内所有的偶數

[[email protected] ~]# seq 2 2 100
2
4
6
8
10
12
14
16
           

6.tr指令:指令用于轉換或删除檔案中的字元

-d:删除指定的字元串

執行個體1:把所有的小寫字母都轉化為大寫字母

[[email protected] ~]# echo “daadadfaedqdac” | tr a-z A-Z
DAADADFAEDQDAC
           

執行個體2:把所有的大寫字母都轉化為小寫字母

[[email protected] ~]# echo “SDSDA2WZFAF” | tr A-Z a-z
sdsda2wzfaf
           

執行個體3:删除一行中的空格

[[email protected] ~]# echo “ada dada dada” | tr -d ” ”
adadadadada
           

轉載于:https://www.cnblogs.com/LibetJohn/p/11126561.html

繼續閱讀