shell腳本編程入門(一)

概述

shell腳本就像是早期DOS年代的批處理文件(.bat),最簡單的功能就是將許多命令寫在一起,讓用戶很輕松能夠一下子處理復雜的操作(執行一個腳本就能夠一次執行多個命令)。而shell腳本更提供數組、循環、條件與邏輯判斷等功能,讓用戶也可以直接以shell來編寫程序,而不必使用類似C語言等傳統程序編寫的語法。

shell腳本基礎

shell腳本是包含一些命令或聲明,并符合一定格式的文本文件

格式要求,首行shebang機制

#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl

shell腳本的用途

自動化常用命令
執行系統管理和故障排除
創建簡單的應用程序
處理文本或文件

運行腳本

給予執行權限,在命令行上指定腳本的絕對或相對路徑

chmod +x /PATH/TO/SCRIPT_FILE
/PATH/TO/SCRIPT_FILE

直接運行解釋器,將腳本作為解釋器程序的參數運行

bash  /PATH/TO/SCRIPT_FILE

腳本檢測

檢測腳本中的語法錯誤

bash -n /path/to/some_script

調試執行(也具有語法檢測功能)會把執行過程顯示出來

bash -x /path/to/some_script

shelll腳本范例

#!/bin/bash
#author: wang
#Version: 1.0
#Description:Thisscriptdisplayssomeinformationaboutyour# environment
echo"Greetings.Thedateandtimeare$(date)" echo"Yourworkingdirectoryis:$(pwd)"

變量

1、什么事變量?

    是命令的存儲空間,存儲著可能發生變化的數據

2、變量的存儲類型

    字符型、數值型(整型和浮點型)

3、變量的作用

    1)、數據存儲格式

    2)、參與的運算

    3)、表示的數據范圍

4、編程程序語言分類

強類型:定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤,如java,python

弱類型:無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用,如:bash 不支持浮點數

5、變量命名法則

1)、不能使程序中的保留字:例如if, for;

2)、只能使用數字、字母及下劃線,且不能以數字開頭

3)、見名知義

4)、統一命名規則:駝峰命名法

6、bash中變量的種類

本地變量:生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell的子shell進程均無效

環境變量:生效范圍為當前shell進程及其子進程

局部變量:生效范圍為當前shell進程中某代碼片斷(通常指函數)

位置變量:$1, $2, …來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數

特殊變量:$?, $0, $*, $@, $#

本地變量

1、變量賦值:name=‘value’,

2、可以使用引用value:

(1) 可以是直接字串; name=“root"

(2) 變量引用:name="$USER"

(3) 命令引用:name=`COMMAND`, name=$(COMMAND)

3、變量引用:${name}, $name

"":弱引用,其中的變量引用會被替換為變量值

'':強引用,其中的變量引用不會被替換為變量值,而保持原字符串

4、顯示已定義的所有變量:set

5、刪除變量:unset name

環境變量

1、變量聲明、賦值:

export name=VALUE

declare -x name=VALUE

2、變量引用:$name, ${name}

3、顯示所有環境變量:

export

env

printenv

4、刪除:unset name

5、bash有許多內建的環境變量:PATH, SHELL, USRE,UID,

位置參數變量

位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數

$1, $2, …:對應第1、第2等參數,shift [n]換位置

$0: 命令本身

$*: 傳遞給腳本的所有參數,全部參數合為一個字符串

$@: 傳遞給腳本的所有參數,每個參數為獨立字符串

$#: 傳遞給腳本的參數的個數

$@ $* 只在被雙引號包起來的時候才會有差異

示例:判斷給出的文件的行數

linecount="$(wc-l $1| cut -d' ' -f1)"
echo "$1 has $linecountlines."

示例:$*與$@的區別

vim arg1.sh

#!/bin/bash
./arg2.sh "$*"
echo ===============
./arg2.sh "$@"

vim arg2.sh

#!/bin/bash
echo 1st is $1
echo 2st is $2
echo all args are is "$*"

結果:因為第一個$*是把全部參數合為一個字符串,可以看出在傳遞過程中abc三個字符用單引號引起來代表他是一個整體,所以在第一個參數顯示的是整體的字符串。$@是把每個參數作為獨立的字符串,所以1sta,2stb

1.png

示例:$@和$*在沒有雙引號的情況下有沒有區別

2.png

3.png

示例:位置變量的參數

由圖可以看出變量從第十個開始發生錯誤

5.png

得出結論兩位數以上的位置參數變量的引用需要用{}大括號引用起來

6.png

只讀變量

   只讀變量:只能聲時,但不能修改和刪除(一般用來定義常量,例如定義pai=3.1415926),可定義為只讀變量后,可以再將其定義為環境變量,既是常量又是環境變量

定義:

readonly name

declare -r name

但是隨shell進程終止而終止

算術運算

1、bash中的算術運算:help let

+, -, *, /, %取模(取余), **(乘方)

2、實現算術運算:

(1) let var=算術表達式

(2) var=$[算術表達式]

(3) var=$((算術表達式))

(4) var=$(expr arg1 arg2 arg3 …)

(5) declare –ivar= 數值

(6) echo ‘算術表達式’ | bc

3、乘法符號有些場景中需要轉義,如*

4、bash有內建的隨機數生成器:$RANDOM(1-32767)

echo $[$RANDOM%50] :0-49之間隨機數

賦值

1、增強型賦值:

+=, -=, *=, /=, %=

2、let varOPERvalue

例如:let count+=3

    自加3后自賦值

3、自增,自減:

let var+=1

let var++

let var-=1

let var–

邏輯運算

1、true, false

1, 0

2、與

1 與1 = 1

1 與0 = 0

0與1 = 0

0與0 = 0

3、或:

1 或1 = 1

1 或0 = 1

0 或1 = 1

0 或0 = 0

4、非:!

! 1 = 0

! 0 = 1

5、短路運算:

短路與:

第一個為0,結果必定為0;

第一個為1,第二個必須要參與運算;

短路或:

    第一個為1,結果必定為1;

第一個為0,第二個必須要參與運算;

6、異或:^

異或的兩個值,相同為假,不同為真

退出狀態

1、進程使用退出狀態來報告成功或失敗

0 代表成功,1-255代表失敗

$? 變量保存最近的命令退出狀態

例如:

$ping-c1-W1hostdown&>/dev/null
$echo$?

2、bash自定義退出狀態碼

exit [n]:自定義退出狀態碼;

注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出狀態取決于exit命令后面的數字

注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行的最后一條命令的狀態碼

測試條件

1、判斷某需求是否滿足,需要由測試機制來實現;

2、專用的測試表達式需要由測試命令輔助完成測試過程;

3、評估布爾聲明,以便用在條件性執行中

若真,則返回0

若假,則返回1

4、測試命令:

test EXPRESSION

[ EXPRESSION ]

[[ EXPRESSION ]]

注意:EXPRESSION前后必須有空白字符

5、根據退出狀態而定,命令可以有條件地運行

&& 代表條件性的AND THEN

|| 代表條件性的OR ELSE

bash的測試類型

1、數值測試:

-gt: 是否大于;

-ge: 是否大于等于;

-eq: 是否等于;

-ne: 是否不等于;

-lt: 是否小于;

-le: 是否小于等于;

2、字符串測試:

==:是否等于;

>: ascii碼是否大于ascii碼

<: 是否小于

!=: 是否不等于

=~: 左側字符串是否能夠被右側的PATTERN所匹配

注意: 此表達式一般用于[[ ]]中;


-z "STRING":字符串是否為空,空為真,不空為假

-n "STRING":字符串是否不空,不空為真,空為假

注意:用于字符串比較時的用到的操作數都應該使用引號

文件測試

1、存在性測試

-a FILE:同-e

-e FILE: 文件存在性測試,存在為真,否則為假;

2、存在性及類別測試

-b FILE:是否存在且為塊設備文件;

-c FILE:是否存在且為字符設備文件;

-d FILE:是否存在且為目錄文件;

-f FILE:是否存在且為普通文件;

-h FILE 或-L FILE:存在且為符號鏈接文件;

-p FILE:是否存在且為命名管道文件;

-S FILE:是否存在且為套接字文件

3、文件權限測試:

-r FILE:是否存在且可讀

-w FILE: 是否存在且可寫

-x FILE: 是否存在且可執行

4、文件特殊權限測試:

-g FILE:是否存在且擁有sgid權限;

-u FILE:是否存在且擁有suid權限;

-k FILE:是否存在且擁有sticky權限;

5、文件大小測試:

-s FILE: 是否存在且非空;

6、文件是否打開:

-t fd: fd表示文件描述符是否已經打開且與某終端相關

-N FILE:文件自動上一次被讀取之后是否被修改過

-O FILE:當前有效用戶是否為文件屬主

-G FILE:當前有效用戶是否為文件屬組

7、雙目測試:

FILE1 -efFILE2: FILE1與FILE2是否指向同一個設備上的相同inode

FILE1 -ntFILE2: FILE1是否新于FILE2;

FILE1 -otFILE2: FILE1是否舊于FILE2;

組合文件測試

第一種方式:

COMMAND1 && COMMAND2 并且

COMMAND1 || COMMAND2 或者

! COMMAND 非

    如:

[ -e FILE ] && [ -r FILE ]

第二種方式:

EXPRESSION1 -a EXPRESSION2 并且

EXPRESSION1 -o EXPRESSION2 或者

! EXPRESSION

必須使用測試命令進行;   

# [ -z “$HOSTNAME” -o $HOSTNAME "=="localhost.localdomain" ] && hostname www.magedu.com
# [ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab

腳本練習

1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。

YUNXING25.png

運行結果

24.png

2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd

26.png

運行結果

27.png

3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利用率最大的值

28.png

運行結果

29.png

4、編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠程主機的IPv4地址和連接數,并按連接數從大到小排序

30.png

運行結果

31.png

5、寫一個腳本/root/bin/sumid.sh,計算/etc/passwd文件中的第10個用戶和第20用戶的ID之和

32.png

6、寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑作為參數給腳本,計算這兩個文件中所有空白行之和

22.png

運行結果

23.png

7、寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件

20.png

運行結果

21.png

8、寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數

18.png

運行結果

19.png

9、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”

16.png

運行結果

17.png

10、chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫

14.png

運行結果

15.png

11、編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充許普通用戶登錄系統。

vim nologin.sh

11.png

vim login.sh

12.png

運行結果

13.png

12、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,先判斷是否合格IP,否,提示IP格式不合法并退出,是,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”

9.png

運行結果

10.png

13、計算1+2+3+…+100的值

#!/bin/bash
#Program:
#       計算1+2+3+...+100的值
#History:
#2016/8/12      clq     first releae
echo {1..100} | tr ' ' '+' | bc

運行結果

8.png

14、計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,否提示錯誤并退出,是則計算之

#!/bin/bash
#Program:
#       計算從腳本第一參數A開始,到第二個參數B的所有數字的總和,判斷B是否大于A,否提示錯誤并退出,是則計算之
#History:
#2016/8/12      clq     first releae

[[ $# -lt 2 ]] && echo "請輸入兩個參數" || ( [[ $2 -gt $1 ]] && seq $1 $2 | tr '\n' '+'| sed -r 's@(.*)\+$@\1\n@' | bc || echo "$2小于$1,輸出錯誤")

運行結果

7.png

原創文章,作者:xiaoqing,如若轉載,請注明出處:http://www.www58058.com/35490

(1)
xiaoqingxiaoqing
上一篇 2016-08-15
下一篇 2016-08-15

相關推薦

  • mysql數據庫及表的管理

    MySQL中字符大小寫: 1、SQL關鍵字及函數名不區分字符大小寫; 2、數據庫、表及視圖名稱的大小區分與否取決于低層OS及FS 3、存儲過程、存儲函數及事件調度器的名字不區分大小寫,但觸發器區分; 4、表別名區分大不寫; 5、對字段中的數據,如果字段類型為Binary類型,則區分大小寫;非Binary不區分大小寫; 數據庫: CREATE {DATABAS…

    Linux干貨 2015-06-01
  • N26-第五周

    1、顯示當前系統上root、fedora或user1用戶的默認shell; [root@localhost test]# cat /etc/passwd | grep -E “^(root|fedora|user1)\>” |cut -d: -f  1,7 root:/bin/bash user1:/bin/bash …

    Linux干貨 2017-02-26
  • shell腳本1

    shell腳本基礎 shell腳本: 包含一些命令或聲明,并符合一定格式的文本文件 格式要求:首行shebang機制 #!/bin/bash #!/usr/bin/python #!/usr/bin/perl shell腳本的用途有: 自動化常用命令 執行系統管理和故障排除 創建簡單的應用程序 處理文本或文件 創建shell腳本 第一步:使用文本編輯器來創建…

    2017-08-05

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-16 15:07

    總結的很全面,整體思路清晰,有理有據,圖文并貌,排版精美,有很用心哦,再接再厲哦。

欧美性久久久久