初窺門徑shell腳本

1.什么是shell腳本

   首先它是一個腳本,并不能作為正式的編程語言。因為是跑在linux的shell中,所以叫shell腳本。確切的說shell腳本就是一些命令的集合。

2.寫腳本前的一些細節及建議

  Shell腳本通常都是以.sh 為后綴名的,這個并不是說不帶.sh這個腳本就不能執行,只是大家的一個習慣而已。所以,以后你發現了.sh為后綴的文件那么它可能是一個shell腳本了。test.sh中第一行要以 “#! /bin/bash” 開頭,它代表的意思是,該文件使用的是bash語法。如果不設置該行,雖然你的shell腳本也可以執行,但是這不符合規范。 # 表示注釋。后面跟一些該腳本的相關注釋內容以及作者和創建日期或者版本等等。當然這些注釋并非必須的,如果你懶的很,可以省略掉,但是我們不建議省略。因為隨著工作時間的逐漸過渡,你寫的shell腳本也會越來越多,如果有一天你回頭查看自己寫過的某個腳本時,很有可能忘記該腳本是用來干什么的以及什么時候寫的。所以寫上注釋是有必要的。另外系統管理員并非只有你一個,如果是其他管理員查看你的腳本,他看不懂豈不是很郁悶。

3.shell腳本編程基礎 

 3.1 基本數學運算

    [root@localhost sbin]# vim first.sh 

    [root@localhost sbin]# bash first.sh 5 6

    11

    [root@localhost sbin]# cat first.sh 

    #! /bin/bash

    ##This is my first shell script

    ##Writen by zhangliang  2016-08-10

    echo $[ $1+$2 ]

    [root@localhost sbin]# 

    QQ圖片20160811154025.png

    其中腳本中的$1和$2為shell腳本的預設變量,沒有限制的。$0代表腳本本身的名字。

    

    [root@localhost sbin]# sh first.sh  1 2

    1 2 first.sh

    [root@localhost sbin]# cat first.sh 

    #! /bin/bash

    ##This is my first shell script

    ##Writen by zhangliang  2016-08-10

    echo "$1 $2 $0"

   上部中的“sh first.sh  1 2”命令其實一般需要有執行權限x   如沒有則可用# chmod + first.sh來添加。

  3.2命令date

    實例 一.Y表示四位數字格式打印年份  y表示兩位數字格式打印年份  其他的則為英文單詞開頭字母大寫

               [root@localhost sbin]# date +"%Y-%m-%d %H:%M:%S"

               2016-08-11 19:07:24

         二. 表示前一天的日期:

               [root@localhost sbin]# date -d "-1 day" +%d

               10

    

   3.3參數前移

      [root@localhost sbin]# vim shift.sh 

     [root@localhost sbin]# sh -x shift.sh             由此可知shift命令每執行一次,變量的個數($#)

     + '[' 0 -eq 0 ']'                                                                               

     [root@localhost sbin]# sh -x shift.sh 1 2 3 4        減一, 變量值提前一位。                         

     + '[' 4 -eq 0 ']'

     + echo

                                                                                                  

     + shift                                                                                         

     + '[' 3 -eq 0 ']'                                                                                     + echo

     + shift

     + '[' 2 -eq 0 ']'

     + echo

     + shift                                                             

     + '[' 1 -eq 0 ']'

     + echo                                                QQ圖片20160811204744.png

     + shift                                

     + '[' 0 -eq 0 ']'

     [root@localhost sbin]# vim shift.sh 

     [root@localhost sbin]# cat shift.sh 

   

 3.4如何計在shell腳本中錨定計數空格行

     [root@localhost sbin]# 

     [root@localhost sbin]# vim konghang.sh 

     [root@localhost sbin]# bash konghang.sh /etc/fstab /etc/issue

     Total blank lines: 2

     QQ圖片20160811153943.png 

     shift命令還有另外一個重要用途,Bsh定義了9個位置變量,從$1到$9,這并不意味著用戶在命令行只能使用9個      參數,借助shift命令可以訪問多于9個的參數。

4實戰演練

  4.1計算1+2+3+…+100的值

  初窺門徑shell腳本

  初窺門徑shell腳本

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

    #! /bin/bash

   ## writer:zhangliang 2016-8-13

   [[  $# -lt 1  ]] && echo "less input one num" || (grep '^$' | wc -l)

   [root@localhost sbin]# bash argsnum.sh /etc/rc.d/init.d/function

   105

   [root@localhost sbin]# bash argsnum.sh 

   less input one num

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

   #! /bin/bash

  ##wrtrer hangliang 2016-8-13

  max='df' |tr -s '' '%'|cut -d '%' -f5|sort -n|tial -1'

  echo "list the maxdisk liyonglu: $max"

  [root@localhost sbin]# ./disk.sh

  list the disk liyonglu: 52

 4.4.使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示其存在,否則添      加之;顯示添加的用戶的id號等信息

#! /bin/bash

##writerzhangliang:2016-08-12 11:09:20

read -p "please input a username: " USERNAME

#`id $USERNAM` &> /dev/null

if id $USERNAME &> /dev/null ; then

        echo "the user exist" 

        exit 100

else

        useradd $USERNAME &> /dev/null

        echo "the user add sucessfully and its info is:`id $USERNAME`"

        exit 99

fi

unset USERNAME

5小結

 由前面例題及小題,深有體會前面學的正則表達式grep,sed工具的重要性

 grep語法: grep  [-cinvABC]  'word'  filename

 -c :打印符合要求的行數

 -i :忽略大小寫 -n :在輸出符合要求的行的同時連同行號一起輸出

 -v :打印不符合要求的行

 . 正則表達式中, “^” 表示行的開始, “$” 表示行的結尾,那么空行則可以用        “^$” 表示

 . 如果是數字的話就用[0-9]這樣的形式,當然有時候也可以用這樣的形式[15]即     只含有1或者5,注意,它不會認為是15。如果要過濾出數字以及大小寫字母則     要這樣寫[0-9a-zA-Z]。另外[ ]還有一種形式,就是[^字符] 表示除[ ]內的字     符之外的字符

 . 表示任意一個字符,上例中,就是把符合r與o之間有兩個任意字符的行過濾出      來, * 表示零個或多個前面的字符。 ‘.*’ 表示零個或多個任意字符,空行也包    含在內.

 .  用( )表示一個整體,例如(oo)+就表示1個 ‘oo’ 或者多個 ‘oo’

    sed與grep有些相通  ,sed -e可以實現多個行為;‘d’ 這個字符就是刪除的動     作了,不僅可以刪除指定的單行以及多行,而且還可以刪除匹配某個字符的         行,另外還可以刪除從某一行一直到文檔末行; ‘s’ 就是替換的命令, ‘g’ 為本     行中全局替換,如果不加 ‘g’ 只換該行中出現的第一個。除了可以使用 ‘/’ 作為     分隔符外,還可以使用其他特殊字符例如 ‘#’ 或者 ‘@’ 都沒有問題。[0-9]表       示任意的數字。這里你也可以寫成[a-zA-Z]甚至[0-9a-zA-Z]; () 可以把替換     的字符括起來成為一個整體。

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

(0)
ZzuimengZzuimeng
上一篇 2016-08-15
下一篇 2016-08-15

相關推薦

  • linux文件系統

    linux的文件系統:             根文件系統為rootfs(root file system)           &nbsp…

    Linux干貨 2015-12-19
  • 通過Nginx來安裝一個discuz,軟件并不是編譯安裝的

    這次由于時間有限,所以我就沒有用編譯安裝來啟動LMP,只有Nginx 是編譯安裝的 因為是在centos7上面安裝的Nginx所以我們這里由于能力有限,暫時不能將其加入開機啟動,日后我會進行改進,將其加入開機啟動。這里我們給出Nginxd的編譯選項及環境   yum groupinstall "Development&…

    Linux干貨 2016-10-25
  • Linux文件管理類命令相關

    Linux文件管理類命令相關 1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。 1)、查看文件命令: (1)ls命令: list,列出目錄下的內容 語法: ls [OPTION]… [FILE]… 常用選項: -a: 顯示所有文件,包括隱藏文件; -A:顯示除.和..之外的所有文件; -l: –…

    Linux干貨 2016-09-24
  • ifconfig命令學習

    ifconfig命令 網絡配置 ifconfig命令被用于配置和顯示Linux內核中網絡接口的網絡參數。用ifconfig命令配置的網卡信息,在網卡重啟后機器重啟后,配置就不存在。要想將上述的配置信息永遠的存的電腦里,那就要修改網卡的配置文件了。 語法 ifconfig(參數) 參數 add<地址>:設置網絡設備IPv6的ip地址; del&lt…

    Linux干貨 2017-07-02
  • 如何正確安裝一個源碼包

        下周就要考試了,心情挺忐忑不安的,前幾天做了25期的考試題,感覺每個題都是老師上課講過的,但是自己做卻想不起來了。這應該就像學習數學一樣,需要大量練習,做的多了自然就會了。     這周我們學習了如何使用yum,還學習了磁盤管理。針對如何安裝源碼包,以httpd包為例我們…

    2017-08-19
  • 計算機的發展及組成

    計算機發展 計算機(Computer):俗稱電腦,是一種能接收和存儲信息,并按照存儲在其內部的程序對海量數據進行自動、高速地處理,然后把處理結果輸出的現代化智能電子設備。 1946年,世界上誕生了第一臺計算機,用于軍事,計算彈道。 1946年數學家馮.諾依曼提出馮諾依曼體系結構,即所有計算機由運算器、控制器、存儲器、輸入設備、輸出設備組成,所有遵循馮.諾依曼…

    Linux干貨 2017-07-13
欧美性久久久久