Shell腳本的編寫

1.什么是Shell腳本

Shell腳本是利用 shell 的功能所寫的一個程序 program,這個程序是使用純文本文件,將一些 shell 的語法與指令(含外部指令)寫在里面, 搭配正則表達式、管線命令與數據流重導向等功能,以達到我們所想要的處理目的。

Shell 腳本可以簡單的被看成是批處理文件, 也可以被說成是一個程序語言,且這個程序語言由于都是利用 shell 與相關工具指令, 所以不需要編譯即可執行,且擁有不錯的除錯 (debug) 工具,所以,shell可以幫助系統管理員快速的管理好主機。

2.Shell腳本特性

自動化常用命令

追蹤與管理系統的重要工作

簡單入侵檢測功能

連續指令單一化

簡易的數據處理

跨平臺支持與學習歷程較短

3.創建shell 腳本

第一步:使用文本編輯器(vim)來創建文本文件

第一行必須包括shell 聲明序列:#!

#!/bin/bash       告訴系統執行的時候要調用什么解釋器)

添加注釋

注釋以# 開頭  # 都是批注用途,加在#后面的數據都被當做批注文字)

第二步:運行腳本

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

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

 

例:計算/etc/passwd文件中的第10個用戶和第20個用戶的ID之和

#!/bin/bash        
#Filename:ID.sh 
文件名:ID.sh
#Description:Test   
描述:測試   
#Author:Rookie  
作者:菜鳥
# Program: This program shows "ID sum!" in your screen. 
程序:這個程序顯示“ID和!“在你的屏幕上
#Email:xxx@126.com
電子郵件:xxx@126.com
#Revision:3.1
修訂號:3.1
#Date:2017-04-14
日期:2017-04-14
#Note:Test

#The 10th in the/etc/passwd file ID of the user
在/etc/passwd文件中第10個用戶的ID
        id1=$(head -10 /etc/passwd | tail -1 | cut -d: -f3)
#The 20th in the/etc/passwd file ID of the user
在/etc/passwd文件中第20個用戶的ID
        id2=$(head -20 /etc/passwd | tail -1 | cut -d: -f3)
#Calculate a 10th of the/etc/passwd file users and 20th the sum of the user's ID
計算/etc/passwd文件中的第10個用戶和第20個用戶的ID之和
        sum=$((id1+id2))

echo ${sum}

按 i 鍵進入輸入模式進行編輯

編輯完成后按 ESC鍵,進入編輯模式后按 ;輸入wq保存退出

[root@station29 scripts]# bash ID.sh 
sum=180                      執行結果  ID和為180

變量:命名的內存空間

數據存儲方式:

字符:

數值:整型,浮點型

變量:變量類型

作用:

1 、數據存儲格式

2 、參與的運算

3 、表示的數據范圍

類型:

字符

數值:整型、浮點型

 

變量

   強類型 :變量 不經過強制轉換,它永遠是這個數據類型,不允許隱式的類型 轉換。一般定義變量時必須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤 java,c#

   弱類型:語言的運行時會隱式做數據類型 轉換。無須指定類型,默認均為字符型;參與運算會自動進行隱式類型轉換;變量無須事先定義可直接調用

如:bash  不支持浮點數,php

變量命名法則:

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

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

3 、見名知義

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


bash 中變量的種類:

根據變量的生效范圍等標準:

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

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

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

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

 ——–shell—–shell                      —————-

                                       |

                  ———–bash shell—–|

shell只會繼承環境變量 并不會繼承父shell中的變量

.  或者 source  /etc/profile  只在當前的shell環境中執行,一般用來校對環境變量

 

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

unset name:刪除變量

export name=將一個變量聲明為環境變量

readonly name=將一個變量聲明為只讀變量

last arg is ${10} 當位置參數達到10或10以上時需要加{}

變量引用:$name   ${name}

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

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

$0:命令本身

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

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

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

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

seet –:清空所在行以下所有位置變量

shift:踢掉變量   shift 5:踢掉5個變量

bash 中的算術運算:help let

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

實現算術運算:

(1) let var= 算術表達式

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

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

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

(5) declare i var =  數值

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

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

[root@localhost ~]# x=100
[root@localhost ~]# y=200
[root@localhost ~]# let z=$x+$y
[root@localhost ~]# echo $z
300

bash 有內建的隨機數生成器:

echo $RANDOM 0-32767

echo $[$RANDOM%50]  0-49

[root@station29 scripts]# echo $[$RANDOM%50]
0
[root@station29 scripts]# echo $[$RANDOM%50]
44
[root@station29 scripts]# echo $[$RANDOM%50]
3
[root@station29 scripts]# echo $RANDOM
28979
[root@station29 scripts]# echo $RANDOM
22390
[root@station29 scripts]# echo $RANDOM
1374

增強型賦值:

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

自增,自減:

let var+=1

let var++

let var-=1

let var–

邏輯運算

非:!

! 1 = 0

! 0 = 1

短路運算

短路與

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

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

短路或

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

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

異或:^

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

 

bash 的測試類型

數值測試:

-gt

是否大于

-ge

是否大于等于

-eq

是否等于

-ne

是否不等于

-lt

是否小于

-le

是否小于等于

字符串測試:

== :是否等于;

>: ascii 碼是否大于ascii碼 碼

<:  是否小于

!=:  是否不等于

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

注意:  此表達式一般用于[[ ]] 中;擴展的正則表達式

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

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

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

存在性測試:

-e-a

文件存在性測試,存在為真,否則為假

-f

是否存在且為普通文件

-d

否存在且為目錄文件

-b

是否存在且為塊設備文件

-c

是否存在且為字符設備文件

-s

是否存在且為套接字文件

-p

是否存在且為命名管道文件

-h/-l

是否存在且為符號鏈接文件

[root@localhost ~]# [ -e /etc/passwd -a -r /etc/passwd ] && echo ok
ok
[root@localhost ~]# [ -e /etc/passwd -a -r /etc/pas ] && echo ok    不存在
[root@localhost ~]# [ -e /etc/passwd -a -r /etc/passwd ] || echo ok 存在

首先,現判斷是否是鏈接文件,再判斷其它類別
[root@localhost ~]# [ -b /etc/passwd ] && echo ok
[root@localhost ~]# [ -b /dev/cdrom ] && echo ok
ok
[root@localhost ~]# ll /dev/cdrom 
lrwxrwxrwx. 1 root root 3 May 16 21:46 /dev/cdrom -> sr0
[root@localhost ~]# [ -L /dev/cdrom ] && echo ok
ok


[root@localhost ~]# [ -d test/ ] && echo ok
ok

[root@localhost ~]# [ -f f1 ] && echo ok
ok

文件權限測試:

-r

是否存在且可讀

-w

是否存在且可寫

-x

是否存在且可執行

-u

是否存在且擁有suid 權限

-g

是否存在且擁有sgid 權限

-k

是否存在且擁有sticky 權限

-s(文件大小測試)

是否存在且非空

[root@localhost ~]# [ -r /etc/passwd ] && echo ok
ok
[root@localhost ~]# [ -w /etc/passwd ] && echo ok
ok
[root@localhost ~]# [ -x /bin/cat ] && echo ok
ok
[root@localhost ~]# [ -u /usr/bin/passwd ] && echo ok
ok
[root@localhost ~]# chmod 2755 /bin/cat 
[root@localhost ~]# [ -g /bin/cat ] && echo ok
ok
[root@localhost ~]# chmod o+t /app
[root@localhost ~]# [ -k /app ] && echo ok
ok
[root@localhost ~]# chmod 777 /app  去掉黏滯位權限

查看既有讀權限又有寫權限
[root@localhost ~]# [ -s /etc/passwd ] && echo ok
ok

[root@localhost ~]# [ -r /etc/passwd -a -w /etc/passwd ] && echo ok
ok

判斷文件不能執行
[root@localhost ~]# [ ! -x /etc/passwd ] && echo ok

文件是否打開:

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

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

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

-G FILE

[root@localhost ~]# [ -N l1 ] && echo ok
ok

[root@localhost ~]# [ -O mbr ] && echo ok
ok

[root@localhost ~]# [ -G mbr ] && echo ok
ok

雙目測試:

FILE1 -ef FILE2: FILE1 FILE2 是否指向同一個設備

上的相同inode

FILE1 -nt FILE2: FILE1 是否新于FILE2

FILE1 -ot FILE2: FILE1 是否舊于FILE2

組合測試條件

第一種方式:

命令1 && 命令2  并且

命令1 || 命令2  或者

[ "$1" -gt "$2" ] && echo "$1 > $2" || echo "$1 <= $2"               $1如果大于$2,就打印“$1>$2”,若不大于,就打印“$1<=$2”

如:[[ -r FILE ]] && [[ -w FILE ]]

第二種方式:

EXPRESSION1 -a EXPRESSION2  并且

EXPRESSION1 -o EXPRESSION2  或者

[ $a -gt 60 -a $a -lt 100 ]  &&  echo Pass                           如果a大于60小于100就打印Pass

必須使用測試命令

 

bash 的配置文件:

按生效范圍劃分,存在兩類:

全局配置:

/etc/profile

/etc/profile.d/*.sh

/etc/bashrc

個人配置:

~/.bash_profile

~/.bashrc

 

交互式登錄:

(1) 直接通過終端輸入賬號密碼登錄;

(2) 使用“ “su – UserName”  切換的用戶

執行順序:

/etc/profile –> /etc/profile.d/*.sh –>~/.bash_profile –> ~/.bashrc –> /etc/bashrc

非交互式登錄:

(1)su UserName

(2) 圖形界面下打開的終端

(3) 執行腳本

執行順序:

~/.bashrc –> /etc/bashrc –>/etc/profile.d/*.sh

 

編輯配置文件生效:

修改profile bashrc 文件后需生效

兩種 方法:

1 重新啟動shell 進程

2 source

 :  . ~/.bashrc

 

 

條件性的執行操作符:

將多個條件寫入一個中括號內的情況之外, 可以多個中括號來隔開喔!而括號與括號之間,則以 && || 來隔開,他們的意義是:

 && :

命令1成功,就執行命令2

命令1 失敗,就不執行命令2

 ||  :或

命令1成功,就不執行命令2

命令1失敗,就執行命令2

 

例:

1. 這個文件是否存在,若不存在則給予一個『Filename does not exist』的訊息,并中斷程序;

2. 若這個文件存在,則判斷他是個文件或目錄,結果輸出『Filename is regular file』或 『Filename is directory

3. 判斷一下,執行者的身份對這個文件或目錄所擁有的權限,并輸出權限數據!

#!/bin/bash             
#Filename:quanxian.sh   
#Description:Test               
#Author:Rookie  
# Program:
#  User input a filename, program will check the flowing:
#  1.exist? 2.file/directory? 3.file permissions
#Email:xxx@126.com
#Revision:3.2
#Date:2017-04-14
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 1. 讓使用者輸入檔名,并且判斷使用者是否真的有輸入字符串?
echo -e "Please input a filename, I will check the filename's type and permission. \n\n"
read -p "Input a filename : " filename
test -z ${filename} && echo "You MUST input a filename." && exit 0
# 2. 判斷文件是否存在?若不存在則顯示訊息并結束腳本
test ! -e ${filename} && echo "The filename '${filename}' DO NOT exist" && exit 0
# 3. 開始判斷文件類型與屬性
test -f ${filename} && filetype="regulare file"
test -d ${filename} && filetype="directory"
test -r ${filename} && perm="readable"
test -w ${filename} && perm="${perm} writable"
test -x ${filename} && perm="${perm} executable"

輸出結果

[root@station29 scripts]# bash quanxian.sh 
Please input a filename, I will check the filename's type and permission. 
請輸入文件名,我將檢查文件名的類型和權限
Input a filename : /etc
The filename: /etc is a directory               文件名:/etc是目錄
And the permissions for you are : readable writable executable      你的權限:可讀可寫可執行

一個條件判斷,分成功進行與失敗進行 (else)

if [ 條件判斷式  ]; then

當條件判斷式成立時,可以進行的指令工作內容;

else

當條件判斷式不成立時,可以進行的指令工作內容;

Fi

多個條件判斷 (if … elif … elif … else) 分多種不同情況執行

if [ 條件判斷式一  ]; then

當條件判斷式一成立時,可以進行的指令工作內容;

elif [ 條件判斷式二  ]; then

當條件判斷式二成立時,可以進行的指令工作內容;

else

當條件判斷式一與二均不成立時,可以進行的指令工作內容;

Fi

elif 也是個判斷式,因此出現 elif 后面都要接 then 來處理

 

例:

1. 當執行一個程序的時候,這個程序會讓用戶選擇 Y N

2. 如果用戶輸入 Y y 時,就顯示OK, continue

3. 如果用戶輸入 n N 時,就顯示 Oh, interrupt !

4. 如果不是 Y/y/N/n 之內的其他字符,就顯示 I don’t know what your choice is 

#!/bin/bash             
#Filename:panduanshi.sh   
#Description:Test  
#Author:Rookie  
# Program:shows the user's choice
#Email:xxx@126.com
#Revision:3.2
#Date:2017-04-14
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

read -p "Please input (Y/N): " yn

if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then                   如果輸入y 那么
        echo "OK, continue"                             繼續
elif [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then             如果輸入n 那么
        echo "Oh, interrupt!"                               中斷
else
        echo "I don't know what your choice is" 輸入其它字符,顯示我不知道你選擇什么
fi

[root@station29 scripts]# bash panduanshi.sh
Please input (Y/N): y
OK, continue                                繼續
[root@station29 scripts]# bash panduanshi.sh
Please input (Y/N): n
Oh, interrupt!                              中斷
[root@station29 scripts]# bash panduanshi.sh
Please input (Y/N): q
I don't know what your choice is            我不知道你的選擇是什么

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

(0)
Linux.rookieLinux.rookie
上一篇 2017-04-16
下一篇 2017-04-16

相關推薦

  • grep、egrep、vim練習

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及內部文件的屬組和其它用戶均沒有任何訪問權限。         [root@localhost ~]# install -d -m 600&nb…

    Linux干貨 2016-11-18
  • ?{ 編譯內核;自制linux; }

    編譯內核、自制linux 自制簡單的linux 前提約定 CentOS 6.8 , Kernel-2.6.32-642.el6.x86_64 基于GRUB – 0.97 / 分區與 boot 分區獨立, /boot 分區 100M+ ,/ 根分區看具體需求,此處為 1G Vmware 12.1,新建一個Li…

    Linux干貨 2016-09-15
  • linux下zip包的壓縮與解壓

    linux zip 命令詳解  功能說明:壓縮文件。  語 法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目錄>][-ll][-n <字尾字符串>][-t <日期時間>][-<壓縮效率>][壓縮文件][文件…][-i <范本樣式&gt…

    Linux干貨 2017-04-10
  • 基于lvs調度的web應用——Discuz程序

    實驗環境: 前端主機:10.1.43.101 后端主機1:172.16.0.9   作為lvs-dr的調度器,并且提供mysql和nfs文件共享 后端主機2:172.16.0.2   作為ap服務器之一 后端主機3:172.16.0.3   作為ap服務器之一 實驗拓撲: 后端主機1: [root@node3…

    Linux干貨 2016-10-26
  • lvm邏輯卷 練習題

    創建一個至少有兩個PV組成的大小為20G的名為testvg的VG;要求PE大小為16MB, 而后在卷組中創建大小為5G的邏輯卷testlv;掛載至/users目錄;在/users下創建一個test.txt文件。擴展testlv至7G,要求archlinux用戶的文件不能丟失;收縮testlv至3G,要求archlinux用戶的文件不能丟失;對testlv創建…

    Linux干貨 2017-03-16
  • N22-第三周博客作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 2、取出最后登錄到當前系統的用戶的相關信息。 3、取出當前系統上被用戶當作其默認shell的最多的那個shell。 4、將/etc/passwd中的第三個字段數值最大的后10個用戶的信息全部改為大寫后保存至/tmp/maxusers.txt文件中。 5、取出當前主機的…

    Linux干貨 2016-08-29

評論列表(1條)

  • renjin
    renjin 2017-04-21 10:26

    主要介紹了bash編程的基礎特性及基礎用法,內容寫的很不錯,排版也很好,加油,加油!

欧美性久久久久