Shell腳本編程初步

    shell是指一種應用程序,這個應用程序提供了一個界面,用戶通過這個界面訪問操作系統內核的服務。shell腳本(shell script),是一種為shell編寫的腳本程序。業界所說的shell通常都是指shell腳本,但shell和shell script是兩個不同的概念。shell編程跟java、php編程一樣,只要有一個能編寫代碼的文本編輯器和一個能解釋執行的腳本解釋器就可以了。shell腳本運行時啟動解釋器,由解釋器邊解釋邊運行,當前主流的操作系統都支持shell編程,Linux默認安裝就帶了shell解釋器。bash腳本解釋器,在centos里,/bin/sh是一個指向/bin/bash的符號鏈接;

]#ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 8月   2 03:38 /bin/sh -> bash

    


編寫腳本;打開文本編輯器,新建一個文件,擴展名為sh(sh代表shell),擴展名并不影響腳本執行,見名知意就好。

#!/bin/bash
#

    腳本編程文件格式

    #!/bin/bash

    #daecription:腳本描述

    #version:版本信息

    #author:作者

    #date:日期

   “#!”是一個約定的標記,它告訴系統這個腳本需要什么解釋器來執行。

    腳本運行;給予腳本文件可執行權限,然后./腳本名稱或者直接運行bash 腳本名稱也可運行

    除了頂格的shebang所有以#號開頭的行都會被忽略


變量

    定義變量

        定義變量時,變量名和等號之間不能有空格,變量名不加美元符號($),如:

]#youname=ali

   使用變量

        使用一個定義過的變量,只要在變量名前面加美元符號即可,如:

]#echo $youname
ali

        變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界,如果不加花括號就會出現下邊情況

]#echo "the is $younamehello"
the is

        推薦給所有變量加上花括號,這是個好的編程習慣。

]#echo "i need ${youname}number"
i need alinumber

    變量可以被重復定義賦值

]#name=ali
]#echo $name
ali
]#name=Aisha
]#echo $name
Aisha


算術運算

    有時候經常要在腳本中用到算術運算,方法很多

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

let VAR=expression

]#i=1
]#j=2
]#let sum=$i+$j
]#echo $sum 
3

$[expression] 注:此算法格式中$可省略,如:

]#sum=0
]#sum=$[i+j]
]#echo $sum
3

$((expression))

]#sum=0
]#sum=$(($i+$j))
]#echo $sum 
3

expr argu1 argu2 argu3 注:此運算格式的運算符號需要用空格間隔開,

]#expr 10 + 10 + 10
30

    有些時候乘法符號需要轉義,如

]#expr 10 \* 10
100

增強型賦值:

    變量做某種算術運算后回存至此變量中;

    let i=$i+#,-,*,/,%,**(個人傾向此種格式)注意;有些時候運算符號需要轉義

]#i=1
]#let i=$i+2
]#echo $i
3

    let i+=#

]#i=1
]#let i+=1
]#echo $i
2

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

自增運算:

    VAR=$[$VAT+1]

    let VAR+=1

    let VAR++

]#i=1
]#let i++
]#echo $i
2

自減運算:

    VAR=$[$VAT-1]

    let VAR-=1

    let VAR–

]#i=3
]#let i--
]#echo $i
2


條件測試 

    Linux 的Shell中存在一組測試命令,該組命令用于測試某種條件或某幾種條件是否真實存在。測試命令是判斷語句和循環語句中條件測試工具,所以,其對于編寫Shell腳本非常重要。判斷某需求是否滿足,需要有測試機制來實現;

測試結構

    測試命令用于測試表達式的條件的真假。如果測試的條件為真,則返回一個0值;如果測試條件為假,將返回一個非0整數值。

    測試命令有三種結構,一種是用test命令進行測試,結構如下:

    test EXPRESSION;

    [ EXPRESSION ]

    [[ EXPRESSION ]]

    其中,條件expression是一個表達式,該表達式可為數字、字符串、文本和文件屬性的比較,同時可同時加入各種算術、字符串、文本等運算符。為了提高命令的可讀性,經常使用第二種格式。

    第一種

]#i=5
]#test $i -eq 5
]#echo $?
0

    第二種

]#i=5
]#[ $i -eq 5 ]
]#echo $?
0

    第三種:此方法多用在字符測試情況下使用,因為此方法多會因為標點符號的原因報錯,不推薦使用,推薦第二種。

]#name=ali
]#[[ $name == ali ]]
]#echo $?
0

    第二種方法測試字符示例

]#name=ali
]#[ $name == ali ]
]#echo $?
0


bash的測試類型

    數值測試 ;數值比較       

    -eq:是否等于;[$num1 -eq $num2]

    -ne:是否不等于;

    -gt:是否大于;

    -ge:是否大于等于

    -lt:是否小于

    -le:是否小于等于;

    示例如下;注;退出狀態為0,表示num等于13;反之,退出狀態為非0.

]#num=233
]#[ $num -eq 233 ]
]#echo $?
0

    字符串測試:字符比較

    ==:是否等于;

    >:是否大于

    <:是否小于

    !=:是否不等于

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

    -z"string":判斷指定的字串是否為空;空則為真,不空則假

    -n"string":判斷指定的字串是否不空,不空則真,空則為假;

    注意:有些時候(1)字符串要加引用;(2)要使用雙中括號[[]];

     示例;

]#name=ali
]#name1=Aisha
]#[[ $name == $name1 ]]
]#echo $?
1

    文件測試        

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

    -a file

    -e file

    示例

]#touch test
]#[ -a test ]
]#echo $?
0

    存在性及類型測試

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

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

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

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

-h file或-L file:是否存在并且為符號鏈接文件;

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

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

    示例;

]#[ -d /etc/ ]
]#echo $?
0

    文件權限測試

-r file:是否存在并且對當前用戶可讀;

-w file:是否存在并且對當前用戶可寫;

-s file:是否存在并且對當前用戶可執行;

]#ll file
----------+ 1 root root 0 8月  21 11:15 file
]#chmod u+r file
]#ll file
-r--------+ 1 root root 0 8月  21 11:15 file
~]$ [ -r /testdir/file ]
[hacker@?????? ????? ~]$ echo $?
1    注:所有權限對root都形同虛設,此處普通用戶測試對此文件沒有r的權限

    特殊權限測試

-g file:是否存在并且擁有sgid權限

-u file:是否存在并且擁有suid權限

-k file:是否存在并且擁有sticky權限

    文件是否有內容

-s file:文件是否有內容

    從屬關系;

-O file:當前用戶是否為文件的屬主

-G file:當前用戶是否屬于文件的屬組

雙目測試;

file1 -ef file2:file1與file2是否為執行同一個文件系統上的相同inode的硬鏈接

filr1 -nt file2:file1是否新于file2

file1 -ot file2:file1是否舊于file2


組合測試條件

    邏輯運算符用于測試多個條件是否為真或為假,或使用邏輯非測試單個表達式,這些運算符在Shell編程中經常用到,這些條件一般和測試命令聯用。

             邏輯操作符

邏輯操作                            描述

!expression           如果expression為假,則測試結果為真

expression1 –a expression2   如果expression1和expression2同時為真,則測試結果為真

expression1 –o expression2   如果expression1和expression2有一個為真,則測試結果為真

其中expression為表達式,該表達式描述了一個測試條件。在邏輯運算符表達式中并不是所有的運算符都會被執行。

例:expr1 –a expr2 –a expr3

只有當expr1為真時,才會測試expr2,依次。邏輯或運算符類似。

例:[ -e file_exam –a –x file_exam ]

  [ “$integer1” –lt 20 –o “integer1” –gt 30 ]

注:當邏輯非運算符和表達式之間要有空格。(此部分摘抄自網絡)


邏輯運算

第一種方式

cmd1 && cmd2

cmd1 || cmd2

!cmd

[-O FILE] && [-r FILE](測試文件是否存在并且可讀)

第二種方式

[[EXPRESSION(表達式)1 -a EXPRESSION2]]

[[EXPRESSION(表達式)1 -O EXPRESSION2]]

!EXPRESSION

[-O FILE -a -x file]

]#[ -a file -a -r file ]
]#echo $?
0

   

      

原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/38202

(0)
M20-1馬星M20-1馬星
上一篇 2016-08-24
下一篇 2016-08-24

相關推薦

  • 2016-08-12博客作業

    德摩根定理       在命題邏輯和邏輯代數中,德摩根定律(或稱德摩根定理)是關于命題邏輯規律的一對法則。奧古斯塔斯·德摩根首先發現了在命題邏輯中存在著下面這些關系: 非(P 且 Q)=(非 P)或(非 Q) 非(P 或 Q)=(非 P)且(非 Q)     …

    Linux干貨 2016-08-15
  • 第6天預習xargs命令的用法

    Xargs用法詳解 1. 簡介   之所以能用到這個命令,關鍵是由于很多命令不支持|管道來傳遞參數,而日常工作中有有這個必要,所以就有了xargs命令,例如: find /sbin -perm +700 |ls -l     &n…

    Linux干貨 2016-08-05
  • 我的linux學習方法

    目前記住Linux單詞命令過于困難,現在主要記住linux的命令的作用及用處,不記得單詞可以百度查找做多了自然就記住了。

    Linux干貨 2018-03-17
  • NFS實現共享wordpress

    實驗環境 192.168.68.134 wordpress站點 nfs-server 192.168.68.144 nfs-client   實驗要求 nfs server共享/var/www/html目錄 nfs clinet掛載nfs-server共享的目錄,部署wordpress   nfs server端 先部署wordpress…

    Linux干貨 2017-10-21
  • 馬哥教育網絡班22期+第1周課程練習

    一、計算機組成部分及其功能:硬件系統和軟件系統     1、計算機的硬件系統組成及其功能:         運算器:處理數據的算術運算及邏輯運算即數據加工處理;         控制器:根據…

    Linux干貨 2016-08-15
  • PPTPD搭建

    1、檢查服務器是否支持PPTP服務[root@centos1 ~]# modprobe ppp-compress-18 && echo okok以上命令執行出來顯示是“OK”的話,繼續往下進行![root@centos1 ~]# cat /dev/net/tuncat: /dev/net/tun: 文件描述符處于錯誤狀態以上命令執行出來顯示報…

    Linux干貨 2017-06-09
欧美性久久久久