Linux 的shell腳本編程

shell腳本編程


程序:指令+數據

程序編輯風格:

            過程式:以指令為中心,數據服務于指令

            對象式:以數據為中心,指令服務于數據


shell程序:提供了編程能力,解釋執行

計算機:運行二進制指令


編程語言:

         低級:匯編語言

         高級:編譯:高級語言–>編譯器–>目標代碼

               java,c#,c,c++

               解釋:高級語言–>解釋器–>機器代碼

               shell,per,python


編程邏輯處理方式:

          順序執行

          循環執行

          選擇執行


shell編程:

          過程式,解釋執行

     編程語言的基本結構

          數據存儲,變量,數組

          表達式:a+b

          語句:if


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

首行shebang機制

               #!/bin/bash

               #!/usr/bin/python

               #!/usr/bin/perl


shell腳本用途有:

         自動化常用命令

         執行系統管理和故障排除

         創建簡單的應用程序

         處理文本或文件               


腳本 hello word 例子


#!/bin/bash

#autho:zczx

#Version:1.0

#Description:hello word

echo "hello,word"

:wq

chmod u+x hello.sh

/root/hello.sh


不建議在根目錄PATH加入.

.bash_profile


 bash -n f1  檢查語法是不是完整

 bash -x f1  調試,一條一條執行,發現出錯會報錯可以檢查命令執行順序


變量

變量的內容可以是更改的,內容可以存字符,存數值。不同的變量應用的范圍不同,數據存儲格式不同,參與的運算不同。

 

類型:字符

數值:整形,浮點型


盡量不要使用與系統指令相同的名字作為變量法則名字

1 不能使程序中的保留字

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

           3 駝峰法則,字母首個字母開頭大寫

                                    4 見名知義


大寫

PATH

USER

PWD

OLDPWD

HISTSIZE

HISTFIlESIZE

HISTFILESIZE

SHELL

HOME

PS1

HISTTIMEFORMAT

UID

HISTFILE                                   


bash

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


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

本地變量不能給子進程使用

zczx1=xxx  不能帶空格

zczx1="xxx aaa bbb"   多個用'' ""來引入

echo $zczx1

echo "$zczx1" 強引用,如果變量所引用的指令跟原本指令顯示的一樣輸出。


unset zczx1  刪除變量,釋放變量。


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

export +變量 聲明為環境變量 

declare -x 聲明為環境變量


declare -r 只讀常量,不能修改,刪除。只能退出腳本

readonly name 只讀常量


a=xxx

b=yyy

echo ${a}b

xxxb  a是變量,b不是


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


都只針對當前終端使用


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

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

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

$0: 命令本身

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

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

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

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


$*引用的參數都作為一個獨立的整體 "a b c"

$@引用的參數每個數都能分為獨立的字符 a b c


bash中的算術運算

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

實現算術運算:

             (1)let var =算術表達式

                  let $var*=5 

                  let $var=5 * var

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

              (3) var=[算術表達式]

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

              (5) declare –i var= 數值

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


treu | false

  1      0   

與:有0就為0.1與1為1.

或:有1就為1.0與0為0.

!1=0

!0=1

短路與 &&:第一個條件成立,就執行第二個條件。第一個條件不成立,將不執行。

短路或 ||:第一個條件成立,就不執行第二個條件,第一個條件不成立,才執行第二個條件。

異或:^

     相同為假,不同為真。


聚集命令

有兩種聚集命令的方法:

  復合式:date; who | wc -l

命令會一個接一個地運行

  子shell:(date; who | wc -l ) >>/tmp/trace


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

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

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

echo $? 查詢命令是否成功執行


ping -c1 -w1 10.0.1.0 &> /dev/null

    一次  一秒

當使用了(),里面所執行的內容等于新建了一個子shell運行。    


條件性

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

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

?以便用在條件性執行中

   若真,則返回0

   若假,則返回1

test 

a=haha

b=haha

test $a = $b    [$a -eq $b ] -eq是判斷數字的對比

[ $a = $b ]   字符的對比

[[ $a = $b ]]


[[$1]]可以查詢變量里面是否有定義


bash的測試類型

數值測試:

        -gt:是否大于:

        -ge:是否大于等于:

        -eq:是否等于:

        -ne:是否不等于

        -lt:是否小于:

        -le:是否小于等于:


==:是否等于:

>:Ascill碼是否大于Ascill碼

<:Ascill碼是否小于Ascill碼

!=:是否不等于

=~:左側字符串是否能夠被右側的字符串所匹配,要用[[]]

-z:字符串是否為空,空為真,不空為假。[[]]

-n:字符串是否不空,不空為真,空為假。[[]]

[[-n $a]] 看是不是非0

[[-z $a]] 看是不是為0


文件測試


[-a /etc/]  查看是否存在

  存在性測試

-a FILE:同-e

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

?存在性及類別測試

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

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

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

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

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

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

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


  文件權限測試:

-r FILE:是否存在且可讀

-w FILE: 是否存在且可寫

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

? 文件特殊權限測試:

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

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

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

   文件大小測試:

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

-o 或者


[[ -r /tmp/file1 ]] -a [[ -w /tmp/file1]] && echo '用戶對文件可讀' || echo '用戶對文件不可讀' 

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

QQ圖片20160814135141.png

QQ圖片20160812145425.png

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

QQ圖片20160814135332.png

QQ圖片20160812151237.png

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

QQ圖片20160814135453.png

QQ圖片20160812153702.png

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

QQ圖片20160814135624.png

QQ圖片20160814135728.png

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

QQ圖片20160814135854.png

QQ圖片20160812191647.png

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

QQ圖片20160814140029.png

QQ圖片20160814140842.png

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

QQ圖片20160814140136.png

QQ圖片20160812195454.png

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

QQ圖片20160814141017.png

QQ圖片20160814141159.png

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

QQ圖片20160814112452.png

QQ圖片20160814112554.png

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

QQ圖片20160814114900.png

QQ圖片20160814114925.png

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

QQ圖片20160814125806.png

QQ圖片20160814125940.png

QQ圖片20160814125742.png

QQ圖片20160814125916.png

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

QQ圖片20160814112452.png

QQ圖片20160814112554.png

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

QQ圖片20160814131818.png

QQ圖片20160814142443.png

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

QQ圖片20160814131818.png

QQ圖片20160814131755.png

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

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

相關推薦

  • 馬哥教育網絡班21期+第10周課程練習

    1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情) POST:加電自檢,主板檢測系統硬件。 BOOT sequence:依次查找引導設備(裝有引導程序) MBR:找到引導設備的主引導扇區引導記錄(446k bootloader 64k DPT 2k 結束標志) GRUB: 引導程序的一種,提供一個菜單,允許用戶選擇要啟動系統或不同的內…

    Linux干貨 2016-08-15
  • 網絡服務之Nginx

      在之前一篇博客中我們講述了httpd網絡服務器,那么httpd是個非常穩定安全的一個服務器,這次我們介紹一個新的網絡服務器—-nginx。   Nginx 是俄羅斯人編寫的十分輕量級的 HTTP 服務器,Nginx,它的發音為“engine X”,是一個高性能的HTTP和反向代理服務器(我們主要圍繞這兩…

    2017-06-07
  • N22-妙手-第八周課程練習

    1、請描述網橋、集線器、二層交換機、三層交換機、路由器的功能、使用場景與區別。     網橋:         一種網絡設備,負責網絡橋接,將網絡的多個網段在數據鏈路層連接起來。     集線器: &…

    Linux干貨 2016-11-07
  • 第一周-Linux Basic

        本文主要介紹了計算機的組成及功能、Linux的發行版、Linux哲學思想、一些基本命令、命令幫助的獲取、文件系統層級結構標準。 一、計算機的組成及功能     計算機由硬件和軟件兩大類組成     硬件   &n…

    Linux干貨 2016-11-28
  • Hadoop hdfs分布式文件系統

    一、MapReduce理論基礎 每個MapReduce job都是Hadoop客戶端想要執行的一個工作單元,它一般由輸入數據、MapReduce程序和配置信息組成,而Hadoop會把每個job分隔成兩類任務(task):map任務和reduce任務。在Hadoop集群中有兩類節點來執行兩類job進程的執行 1.1 大數據處理 任何基礎業務包含了收集、分析、監…

    2017-12-08
  • Linux目錄結構

    Linux目錄結構 查看目錄(/) 樹狀目錄結構: 常見目錄的解釋 Linux 下的文件類型 路徑 Linux目錄結構 查看目錄(/) 登錄系統后,在當前命令窗口下輸入命令: [root@localhost ~]# ls /bin   dev  home  lib64       media &nb…

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