Shell腳本編程基礎之一

  Linux為高效管理系統,提供了CLI命令行接口,供用戶在命令提示符下輸入命令,它有很多bash shell基礎特,根據這些特性能夠很靈活的使用命令,也支持使同時輸入多個命令執行,命令之間用冒號分隔;但是要完成復雜多次重復性的操作,非常不便,系統管理工作變得很是繁忙,很難輕松完成工作任務;不過Linux的shell支持腳本編程,通過編寫純文本格式的腳本,執行起來很是滿足自動化要求;不過要想使用它,必須合理規范編寫它,現在Linux系統默認的shell類型基本都是bash shell,所以學習bash shell腳本編程很是實用;

*章節


1)編程基礎

2)腳本基本格式

3)變量


4)邏輯運算

5)算術運算

6)條件測試


1.編程基礎:

  編程語言風格:

      我們知道程序是由指令加數據兩部分組成,cpu通過指令對數據加以處理,要想編寫程序,必須有一定的編程風格,可以分為兩大類;(1)過程式:編寫以指令為中心,注重指令檢查規范,數據服務于指令;(2)對象式:編寫以數據為中心,注重對象的定義,指令服務于數據;

    編程語言類型:

     運行在計算機最底層的是二進制程序指令,也就是0和1,編寫龐大的0和1對于人來說太困難了,于是有了匯編語言,這種語言是跟硬件緊密結合的,需要非常熟悉了解硬件的特性,才能夠編寫出來,所有這種匯編語言還是比較低級,于是有了高級語言,這種語言對人來說還是相對比較容易理解編寫,最終執行還是需要轉換,高級語言也有不同類型,像JAVA,C++這種屬于編譯型高級語言,需要編譯器轉換成目標代碼,而shell,Perl,Python是屬于解釋型語言,需要解釋器轉換成機器代碼。

2.腳本的基本格式:

      

$cat test1.sh
#!/bin/bash
#
#author:root
#version:1.1
#description:the first script ;



echo "hell user ,how are you ?"

$bash -x test1.sh
hell user ,how are you ?

   腳本要求:

   (1)必須指明腳本的shebang;也就是腳本的第一行,必須頂格寫#!/bin/bash,指明執行腳本要用的shell類型,這里的#不是注釋,要注意;

   (2)要有基本的腳本說明信息,這樣利于腳本的管理使用,一般有日期,作者是誰,描述,版本等, 注意:#開頭的行,bash shell默認不執行;

   (3)復雜的代碼片段要寫代碼注釋信息;方便自己和他人后期使用;

   (4)腳本中要有適當的縮進和空白行,這樣腳本內容看起來層次分明,結構清晰;

   (5)在腳本中使用定義變量,需要根據實際遵循一定的命名規范;后面變量詳細說明;

    

   執行腳本的方式:

   (1)把腳本當做參數,給bash直接當做參數執行;

   (2)chmod +x script 授予腳本執行權限x,使用絕對路徑或相對路徑來執行腳本;

  

   腳本調試檢查:

    (1)尤其是復雜大的腳本尤其要事先檢查腳本語法格式,避免任務執行一半的故障;解決很是麻煩;

$ bash -n  /path/to/script       ///檢查語法命令格式

$ bash -x /path/to/script        ///調試腳本 :可以看到腳本的執行過程,初期學習,對于復雜場景分析很是實用

    

  定義腳本退出狀態碼

     exit: 退出腳本

     exit #

        如果腳本沒有明確定義退出狀態碼,那么,最后執行的一條命令的退出碼即為腳本的退出狀態碼;

3.變量

   :變量是命名的內存空間,是一個可變化的量,定義好之后,可以在腳本中多次引用變量值,對于后期的修改和調整很是方便;

   (1)變量類型:

      定義了變量類型,也就決定了數據的存儲格式,變量數據范圍,變量能夠參與的運算;這里的bash shell 可分類為:

      a)字符型;

      b)數值型:數值由包括整數型和浮點型;

   

   (2)注意:對于強類型語言比較說java python這些大型編程語言,對于變量的使用必須要事先聲明類型,否則語法錯誤,而對于bash shell 這種只支持腳本的弱類型編程語言,變量在使用不需要聲明,默認變量類型為字符型,默認當做字符處理;

  

   (3)變量的命令規則:

      a)首先不能使用系統定義過和系統保留字,比如說一些測試表達式的關鍵字,if,如果使用了系統變量,腳本執行是會覆蓋系統變量值,造成其他執行環境錯亂;

      b)只能使用字母數字下劃線,不能以數字開頭;

      c)變量能夠做到見名知意;

      d)命名使用一定要有語言規范,比如說駝峰命名法,具體根據實際生產環境使用場合調整;

      

   (4)根據變量的作用生效范圍分類:

      a)局部變量:只對當前的shell腳本代碼段有效;

      b)本地變量:只對當前shell進程生效,不包含子進程;

      c)環境變量:對當前shell進程及其子進程都生效;

      d)位置參數變量:

         $1:引用的是腳本后跟的第一個參數,$2:引用的是腳本后跟的第二個參數;…${10}:表示引用的是腳本后跟的第十個參數…(注意:這里大于9以上要用花括號“{ }”);

     e)特殊變量:

         $?:判斷上一條命名的執行狀態結果;

         $0:引用的是腳本的本身完成的路徑名;

         $#:表示的參數個數;

         $*:表示的是參數的集合,不過這里表示的是把所有的參數當成一個字符串整體;

         $@:表示的是所有的參數,不過這里表示的是把每個參數當成一個個獨立的參數字符串; 

      

      程序執行結果

      程序執行,可能有兩類返回值:程序狀態返回代碼(0-255)


         0: 正確執行

     1-255:錯誤執行,1,2,127系統預留

         

    (5)變量賦值:

          1.本地變量賦值:

           set VARNAME=VALUE

            注意:set可以省略不寫

          2.環境變量賦值:

            export VARNAME=VALUE

            注意;也可以先賦值后設置成環境變量,方法如下

            VARNAME=VALUE

            export VARNAME

          3.局部變量賦值:

               local VARNAME=VALUE

               注意可以不寫local,因為在腳本中會定義的變量,作用在局部;

          4.追加賦值:

              VARNAME=$VARNAME:VALUE

               注意:追加變量賦值,要用冒號;

         

     

     (6)查看變量:

             查看shell中所有變量:

$set

             查看當前shell中的環境變量:

$printenv
 
$env

$export

      (7)撤銷變量:

$unset VARNAME       ///注意這里指定變量名即可撤銷;

       

      (8)變量引用:

$ var1=tom
$ echo "hello $var1"
hello tom

         注意:在引用變量時,如果后面跟其他字符,注意用花括號“{ }”引起來,避免混亂;如下

$ var1=Tom 
$ ehco "$var1and I  like to read books."
I like to read books.                        ///這里表示引用的:是一個叫var1and的變量名,var1and 沒有賦值;

$ var1=Tom
$ ehco "${var1}and I  like to read books."
Tomand I like to read books.

        注意:"" 兩個雙引號表示弱引用,變量名會替換變量值; ''兩個單引號表示的是強引用,引用是不替換變量值,

$ var2=xiaoming
$ echo "hello $var2"
$ hello xiaoming
$
$ ehco 'hello $var2'
$ hello $var2

      (9)“兩個反引號可以實現命令替換引用

$ whoami 
xia
$ var3=`whoami`
$ echo "how are you $var3"
how are you xia

      (10)只讀變量:只讀變量設定后不能再次賦值,生效范圍只在當前shell進程,不包含子進程。

         設置方式:

              a) readonly VARNAME=VALUE

              b) declare -r VARNAME=VALUE

$ readonly  xsx=xiashixiang
$ echo $xsx
xiashixiang
$ xsx=hello
-bash: xsx: readonly variable      ///這里直接報錯,說只讀變量不可再次賦值;
$ unset xsx
-bash: unset: xsx: cannot unset: readonly variable    ///這里也說明只讀變量不可撤銷,只能重新登錄當前shell

4.邏輯運算:

邏輯運算:與、或、非、異或

1: 真

0: 假

1 & 0 = 0

0 & 1 = 0

0 & 0 = 0

1 & 1 = 1

總結:做與運算兩者為真,結果才為真;

或:

1 & 0 = 1

1 & 1 = 1 

0 & 1 = 1

0 & 0 = 0 

總結:做或運算只要有一者為真,結果就為真;

非:

! 真 = 假

! 假 = 真

總結:做非判斷,取反;

異或

1 & 0 = 1

1 & 1 = 0

0 & 1 = 1

0 & 0 = 0 

總結:兩者不同則為真,相同則為假;

命令的間邏輯關系:

    邏輯與: &&

          1.第一條命令為真時:

                  第二條命令為真時,才會執行;

                  第二條命令為假時,不會執行;

          2.第-條命令為假時:

                   第二條命令為真時,不會看

                   第二條命令為假時,不會看

                  

    邏輯或: ||

          1.第一條命令為真時:

                    第二條命令為真時,不會看

                    第二條命令為假時,不會看

          2.第一條命令為假時:

                     第二條為真時,執行第二條;

                     第二條為假,不會執行;

                    

5.算術運算:

bash默認對字符處理 

1.基本運算符:

  + – * / ** %

  注意)*:乘法符號有時在特定情境下需要轉義”/*“;

2.運算方式:遵循算術運算格式

  (1)let var=算術運算表達式

  (2)$[算術運算表達式]

  (3)$((算術運算表達式))

  (4)expr 算術運算表達式(注意算術符之間必須有空格分割)

      引用var=$(expr $ARG1 $OP $ARG2)

  (5)echo "options;expression"|bc

  (6)下面一一列舉算術運算表達式:

$ a=100
$ b=3
$ let var3=$a+$b
$ echo $var3
103
$
$ echo $[$a+$b]
103
$
$ echo $[a+b]
103
$
$ echo $(($a+$b)) 
103
$
$ expr $a + $b
103
$
$ expr $a * $b
expr: syntax error           ///注意這里的乘法符號沒有轉義語法報錯;
$
$ expr $a \* $b
300
$
$ var4=$(expr $a + $b)
$ echo $var4
103

6.條件測試:

   根據數據類型測試可以分為如下:

   (1)整數測試;

   (2)字符測試;

   (3)文件測試:

   

   條件測試的表達式:

  [ expression ]

  [[ expression ]]

  test expresion

  *注意:方括號中的表達式兩邊必須有空格,否則語法錯誤如下;

#[100 -eq 100 ]
-bash: [100: command not found

 

1.整數測試操作符:要做整數測試,需要用到整數比較符號;

   -eq :測試兩個整數是否相等;相等測為真,不等則為假;

#a=100
#b=100
#[ $a -eq $b ]
#echo $?
0
#
#b=200
#[ $a -eq $b ]
#echo $?
1

   -ne:測試兩個整數是否不等,不等為真,相等為假;

#a=100
#b=200
#[ $a -ne $b ]
#echo $?
0
#
#b=100
#[ $a -ne $b ]
#echo $?
1

    -gt:測試一個前一個整數是否大于后一個整數,大于為真,不大于為假;

#a=200
#b=100
#[ $a -gt $b ]
#echo $?
0
#
#a=10
#[ $a -gt $b ]
#echo $?
1

    -lt:測試前一個整數是否小于后一個整數,小于為真,不小于為假;

#a=100
#b=200
#[ $a -lt $b ]
#echo $?
0
#
#a=300
#[ $a -lt $b ]
#echo $?
1

    -ge:測試前一個整數是否大于或等于后一個整數,大于或等于則為真,不大于或等于則為假;

#a=100
#b=10
#[ $a -ge $b ]
echo $?
0
#b=100
#[ $a -ge $b ]
#echo $?
0
#b=200
#[ $a -ge $b ]
#echo $?
1

    -le:測試前一個整數是否小于或等于后一個整數,小于或等于則為真,不小于或等于則為假;

#a=100
#b=200
#[ $a -le $b ]
#echo $?
0
#a=200
#[ $a -le $b ]
#echo $?
0
#a=300
#[ $a -le $b ]
#echo $?
1

2.字符測試操作比較符;

    *注意:

        (1)字符或字符串比較,需要用兩個方括號“[[ ]]”,否則就無法判斷;

        (2)字符比較嚴格區分大小寫,默認根據字母逆序排大小,b大于a;同時大寫字母大于小寫字母,B大于b;相同則向下逐級比較;

        

    == 測試兩個字符或字符竄是否相同,相同為真,不同為假;

#var5=xiaoming
#var6=xiaoming
#[[ $var5 == $var6 ]]
#echo $?
0
#var6=xiaohong
#[[ $var5 == $var6 ]]
#echo $?
1

   != 測試兩個字符或字符串是否不同,不同為真,相同為假;

#var5=aaa
#var6=bbb
#[[ $var5 != $var6 ]]
#echo $?
0
#var6=aaa
#[[ $var5 != $var6 ]]
echo $?
1

   > 測試前一個字符或字符串是否大于后一個字符或字符串,大于則為真,不大于則為假;

   < 測試前一個字符或字符串是否小于后一個字符或字符串,小于則為真,不小于則為假;

#var7=AAA
#var8=aaa
#[[ $var7 > $var8 ]]
# echo $?
0
#
#[[ $var7 < $var8 ]]
#echo $?
1

   

   -n string: 測試指定字符串是否不為空,不空則真,空則假;

   -z string: 測試指定字符串是否為空,不空為真,不空則為假;

#var9=xia
#[[ -n $var9 ]]
#echo $?
0
#[[ -z $var9 ]]
#echo $?
1
#var9=
#[[ -z $var9 ]]
#echo $?
0

3.文件測試:

   (1)文件存在測試:

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

    -a FILE:等同于-e

   (2)文件類別測試:

    -d FILE:測試是否為目錄,目錄為真,不是目錄為假;

    -f FILE:測試是否為普通文件,是普通文件則為真,不是則為假;

    -p FILE:測試是否為命名管道文件,是為真,不是為假;

    -h FILE:測試是否為軟連接文件,是軟連接文件則為真,不是則為假;

    -L FILE:等同于-h

    -S FILE:測試是否為套接字文件,是套接字文件則為真,不是則為假;

    -b FILE:測試是否為塊設備文件,是塊設備文件則為真,不是則為假;

    -c FILE:測試是否為字符設備文件,是字符設備文件則為真,不是則為假;

   (3)空文件測試

    -s FILE:測試是否為空文件,也就是文件大小為0,文件存在且為空則為真,文件有數據則為假;

   (4)文件權限測試

    -r FILE:測試當前用戶是否對文件有讀權限,有則為真,沒有則為假;

    -w FILE:測試當前用戶是否對文件有寫權限,有則為真,沒有則為假;

    -x FILE:測試當前用戶是否對文件有執行權限,有則為真,沒有則為假;

    

    (5)文件特權權限測試:

    -u FILE:測試文件是否有suid權限,有則為真,沒有則為假;

    -g FILE:測試文件是否有sgid權限,有則為真,沒有則為假;

    -k FILE:測試文件是否有sticky權限,有則為真,沒有則為假;

    

    (6)文件屬主屬組測試:

    -O FILE:測試當前用戶是否是文件的屬主,是為真,不是則為假;

    -G FILE:測試當前用戶是否是文件的屬組,是為真,不是則為假;

    

   (7)文件雙目測試:

    FILE1 -ef FILE2 :測試兩個文件的的inode是否相同,也就是說是兩個相同的硬鏈接文件;

    FILE1 -nt FILE2 :測試FILE1是否新于FILE2,也就是說FILE2是老文件,FILE1新為真,FILE2新為假;

    FILE1 -ot FILE2 :測試FILE1是否舊于FILE2,FILE1新為假,舊為真;

  

  

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

(0)
xiashixiangxiashixiang
上一篇 2016-08-15 09:24
下一篇 2016-08-15 09:24

相關推薦

  • N25-第11周博客作業

    1、詳細描述一次加密通訊的過程,結合圖示最佳。 第一步:他們需要實現協商好對稱加密算法,單向加密算法,公鑰加密算法,交換公鑰等。 第二步:B用戶想要將數據傳給A,首先需要使用單向加密算法取出數據的特征碼,并用自己的私鑰對這段特征碼進行加密(數字簽名),B用戶生成臨時對稱密鑰,并用對稱密鑰加密整段數據,B用戶使用 A用戶的公鑰加密一次性對稱密鑰,附加在整段數據…

    Linux干貨 2017-05-21
  • 8.9_Linux文本處理三劍客之sed和文本編輯利器vim的使用

    本文處理三劍客之sed的使用   什么是sed? Stream EDitor(簡稱sed), 行編輯器,一次只讀一行,只處理一行,不對源文件做處理,至輸出到屏幕上。 sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩…

    Linux干貨 2016-08-11
  • Linux磁盤管理高級

    Linux磁盤管理高級 LVM Btrsh LVM 邏輯卷管理(LVM)指系統將物理卷管理抽象成一個邏輯卷,包括重新設定文件系統的大小,LVM可以彈性的更改LVM的容量,通過交換PE來進行資料的轉換,將原來LV內的PE轉移到其他的設備中以降低LV的容量,或將其他設備中的PE加到LV中以加大容量。 LVM還有快照的功能,快照區與原本的LV共用很多PE的區塊,因…

    Linux干貨 2016-09-09
  • 第二周博客作業

    1.linux上的文件管理類命令都用哪些,其常用的使用方法及其相關示例演示。 常用命令有:cp, mv, rm 復制命令:cp cp [OPTION]… [-T] SOURCE DEST                 cp [OPTION]… SOURC…

    Linux干貨 2016-06-23
  • 8月20日軟件包管理

    軟件包管理 本章內容 軟件運行環境 軟件包基礎 Rpm包管理 yum管理 定制yum倉庫 編譯安裝 軟件運行環境 API:Application Programming Interface     POSIX:Portable OS 程序源代碼–>預處理–>編譯–>…

    Linux干貨 2016-08-21
  • 整型、浮點型在內存中的存儲方式

      在學習C語言的過程中,有時候會想,數據到底是以什么樣的方式在內存中存儲的呢?經過一段時間的查閱資料,小編終于整理了一些…… 以VC6.0編譯器為測試環境(int型為4Byte) 先簡介一下大小端模式,具體資料可參考 http://blog.csdn.net/ce123_zhouwei/article/details/6971544  …

    Linux干貨 2016-01-14

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-15 17:06

    總結的很詳細,作業需要不上來哦。

欧美性久久久久