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 09:24
下一篇 2016-08-15 09:24

相關推薦

  • HAProxy服務配置

    HAProxy 是一款提供高可用性、負載均衡以及基于TCP(第四層)和HTTP(第七層)應用的代理軟件。 相較與 Nginx,HAProxy 更專注與反向代理,因此它可以支持更多的選項,更精細的控制,更多的健康狀態檢測機制和負載均衡算法。 四層和七層負載均衡的區別: 四層: 通過分析IP層及TCP/UDP層的流量實現的基于“IP+端口”的負載均衡。 七層: …

    Linux干貨 2017-05-19
  • 網絡管理之路由實現

    一.概述 跨網絡通信:路由     路由分類:         主機路由         網絡路由      …

    Linux干貨 2016-09-19
  • 第三章 Linux文件系統初步

    用戶界面:      可分為兩種GUI和CLI         GUI(Graphical User Interface,簡稱 GUI,又稱圖形用戶接口)是指采用圖形方式顯示的計算機操作用戶界面。 GNOME(英語發音:/ɡ?no?m/或英語發音:/…

    Linux干貨 2016-06-03
  • VIM編輯器用法及練習

    VIM編輯器用法及練習 什么是vim? vim是從vi發展出來的一個文本編輯器。代碼補全、編譯及錯誤跳轉等方便編程的功能特別豐富,在程序員中被廣泛使用,和Emacs并列成為類Unix系統用戶最喜歡的文本編輯器。 Vim的第一個版本由布萊姆·米勒在1991年發布。最初的簡稱是Vi IMitation,隨著功能的不斷增加,正式名稱改成了Vi IMproved?,F…

    Linux干貨 2016-10-30
  • select基本用法和軟件包管理

    一、select語句     select語句在腳本中用于創建菜單,按數字順序排列的菜單項顯示在標準輸出上,并用PS3提示符,等待用戶輸入。用戶輸入菜單中的某個數字,執行相應的命令,并被保存在內置變量REPLY中。 用法:     select NAME [in WORDS &#…

    Linux干貨 2016-08-21
  • 20 shell腳本編程1

    20 shell腳本編程1 一、雜項知識整理 1、腳本文件格式:     #!/bin/bash     (注釋信息:)     #description:say hello     #vesion:…

    Linux干貨 2016-08-11
欧美性久久久久