2016/08/11:初涉shell腳本編程

感悟 : 

  經過對文本處理工具grep,sed等內容的,以及vim文本編輯器的學習,馬不停蹄的又進行了對shell腳本的學習。對shell腳本的認識是可以保存在本地,用的時候只要執行相關腳本,簡短的命令就可以完成操作,可以用來應對日常重復性工作,有效提高系統管理員的效率,避免在重復性工作上花費不必要的時間。


*************************************************************************************

shell腳本的用途有:
  自動化常用命令
  執行系統管理和故障排除
  創建簡單的應用程序

  處理文本或者文件


示例

    #!/bin/bash

    #author:LH

    #Version:1.0

    #Description:This script displays some imformation about your system.


腳本編輯完成后,需要進行幾個步驟,確??梢哉_執行

    1.chmod +x script或 bash script

    2.bash -n script 檢查腳本中語法錯誤

    3.bash -x 調試執行,按照腳本順序


變量 :實際就是命名的內存空間


編程語言分類

    強類型 :定義變量時要指定類型,java,python等

    弱類型 :無需提前指定類型,可直接調用

    

    變量命名規則:

        不能使用和保留字相同的名字

        只能使用數字字母下劃線,數字不可開頭

        見名知意

        駝峰命名法:大小駝峰


變量種類

        1.本地變量 作用范圍為當前shell進程,對其他進程,以及子shell無效

        2.環境變量 作用范圍是當前shell及其子進程

        3.局部變量 作用范圍為當前shell某段(一般是函數)

        4.位置變量 $1 $2 $3 …用于讓腳本在腳本代碼中調用傳入的參數

        5 特殊變量

                $? 上次命令執行狀態

                $0 在腳本內部引用腳本名稱本身

                $# 傳遞給當前腳本的參數的個數

                *************

                $* 和$@:表面的意思相同,都是表示傳遞給當前腳本的所有參數

                    區別:

                           $* 把所有參數看做一條字符串

                           $@ 所有參數讓當做單獨的字符串

    

引用方式

        變量引用 name="$USER",不可使用''

        命令引用 name=`CMD` =$(CMD)       

    

顯示所有變量 set

刪除變量 :unset name ,通常用于腳本末尾,釋放變量的命名空間,有利于內存合理使用


*********************************************

環境變量聲明、賦值

        ecport name=value

        declare -x name=VALUE

     引用方式和本地變量相同        

  

顯示所有環境變量:

    export    

    env

    printenv

刪除變量:unset name

bash 的內置環境變量

    PATH 環境變量   

    SHELL

    USER 當前用戶

    UID 當前用戶UID

    HISTSIZE 歷史命令保存數目

    HOME

    PWD 當前目錄

    OLDPWD 前一個目錄

    HISTFILE 歷史文件路徑

    PS1       

   PPID 父目錄


只讀變量:只能讀,但不能修改刪除

    

》》》》》》》》》》》》》》》》》》》》》》

算數運算

    ** 乘方

    實現

        1.、let var=2+8 –>echo $var

        2. echo '2+8'|bc  

        3. echo $[$RANDOM%50] 0-49間隨機數   

      

賦值

    let var++ 先賦值,再運算

    let ++var 先運算,再賦值

 

    +=自加,-=,*=,/= %=

 

邏輯運算:

    與:都為1時,才為1

    或:都為0時,才為0

    

   短路運算:

        與

            

        或

   異或 

    相同為假,相同為真

聚集命令,就是;連接,然后按照從左至右順序一個一個運行


條件性的執行操作符

    && – -AND THEN

    || – -OR ELSE

     $ grep -q no_such_user /etc/passwd \

        || echo 'No such user'  \為換行執行



*************************

數值測試

    -gt

    -ge

    -lt

    -le

    -ne 是否不等于

    -eq 是否等于


字符串測試

    > ASCLL 是否大于

    'string'=~ /pattern/ 左側字符串是否被右側PATTErn匹配到

    -z "string" 字符串是否為空,空為真,不空為假

    -n 與-z相反 


文件測試

    -e -a 文件存在為真,否為假

    -L 是否存在且為符號鏈接文件

    -p 管道文件

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

文件權限測試

    -r

    -w

    -x 是否存在且可執行


特殊權限測試

    -g sgid

    -u 是否存在且擁有suid

    -k 是否存在sticky權限


文件大小測試

    -s FILE:是否存在且非空


文件是否打開

    -t fd 表示文件描述符是否已經打開且與某終端相關

    -N FILE:文件自上次讀取之后是否被修改過

    -O FILE 當前用戶是否為文件屬主

    -G  是否為文件屬組


雙目測試:

    FILE1 -ef FILE2:1和2是否指向同一個設備上的相同inode

    

組合條件測試

    1.CMD1 && CMD 2 并且

        CMD1 || CMD 2 或者

    2.

    -a 并且

    -o 或者

    必須使用測試命令 ,test



*************************************

*************************************

**********************************8**    

練習

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

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

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

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

 netstat -nt |tr -s ' '|cut -d' ' -f5|tr -cs '0-9.' '\n'|egrep '([0-9]+.){3}[0-9]+'|uniq -c|sort -nr|tr -s ' ' '\t'

2 172.18.19.48

1 10.1.250.94

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

echo `sed -n -e 10p -e 20p /etc/passwd|cut -d: -f3|tr '\n' +|sed -r 's@(.*)\+@\1@'`|bc

sed -n -e 10p -e 20p /etc/passwd 

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

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

7、寫一個腳本/root/bin/argsnum.sh,

接受一個文件路徑作為參數;如果參數個數小于1,則提示用戶“至少應該給一個參數”,

并立即退出;如果參數個數不小于1,則顯示第一個參數所指向的文件中的空白行數

8、寫一個腳本/root/bin/hostping.sh,

接受一個主機的IPv4地址做為參數,測試是否可連通

。如果能ping通,則提示用戶“該IP地址可訪問”;

如果不可ping通,則提示用戶“該IP地址不可訪問”

9、chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,

判斷當前用戶對/tmp/fiile1文件是否不可讀且不可寫

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

[ -f /etc/nologin ] && echo "user disable login already" || (touch /etc/nologin; echo user disable login )

[ -f /etc/nologin ] && (rm -f /etc/nologin;echo user enable login) ||  echo user disable login already

11、寫一個腳本/root/bin/hostping.sh,接受一個主機的IPv4地址做為參數,先判斷是否合格IP,

否,提示IP格式不合法并退出,是,測試是否可連通。如果能ping通,則提示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“該IP地址不可訪問”

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

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

    




    


                


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

(0)
000000
上一篇 2016-08-16 13:59
下一篇 2016-08-16 13:59

相關推薦

  • N21-北京-兔鍋-馬哥教育網絡班21期+第3周課程練習

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。    who | cut -d' ' -f1 | uniq   2、取出最后登錄到當前系統的用戶的相關信息。    who | ta…

    系統運維 2016-07-07
  • ELK 日志分析實例

    網海過客www.chinasa.net ELK 日志分析實例一、ELK-web日志分析二、ELK-MySQL 慢查詢日志分析三、ELK-SSH登陸日志分析四、ELK-vsftpd 日志分析 一、ELK-web日志分析 通過logstash grok正則將web日志過濾出來,輸出到Elasticsearch 搜索引擎里,通過Kibana前端展示。  …

    Linux干貨 2016-06-03
  • Linux自動備份腳本

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1541163        今天網上一個朋友問了我一個shell的題目,讓我幫他做下。下面是題目以及解題思路。 題目:…

    Linux干貨 2016-08-15
  • keepalived的實驗:主主模型

    修改配置文件 [root@proxy1 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived   global_defs { notification_email { root@localhost } notification_email_from k…

    2018-03-11
  • 第一章 linux的安裝及簡單的命令合集

    linux安裝;簡答命令:注釋;常見用法

    Linux干貨 2018-03-17
  • 網絡相關命令

    網絡相關命令 常用命令 ifcfg家族:   ifconfig:配置IP,NETMASK   route :路由   netstat : 狀態及統計數據查看 iproute2家族     ip  系列 &nbs…

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