shell腳本編程初步

shell腳本編程初步

   隨著課程學習的深入,我們已經學習了一些常用的命令,會去解決了一部分簡單的問題,但是這不能滿足復雜的工作,它可以幫助我執行自動化的常用命令、執行系統管理和故障排除、創建簡單的應用程序、處理文本或文件。所以我們開始了shell腳本的編程,幫助我們更好的去完成工作。簡單地說,shell編程相當于幫我們之前學習的許多命令進行了深度的結合。

一、shell腳本基礎界面

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

格式要求:首行shebang機制

 如:#!/bin/bash

     #!/usr/bin/python

     #!/usr/bin/perl

我們打開一個腳本查看一下,例如打開/root/bin/AandB.sh

圖片1.png 

1行:定義shebang機制(一般必須有);

2行:為本腳本添加的備注與相關描述(可有可無,建議養成好的習慣);

3行:命令行的書寫,可以書寫多行。但是要代碼數量盡量簡潔。

二、腳本的調試命令

  我們可以通過使用bash -n /path/to/some_script去檢測腳本中的語法錯誤。還可以通過bash -x /path/to/some_script進行調試執行。

三、腳本中的幾種變量

  1、本地變量

(1)變量的賦值:

name=value;echo $name 可以顯示出value

 value可以是直接字串; name=root"

 value變量引用:name="$USER"

 value命令引用:name=` COMMAND `, name =$(COMMAND)

(2)生效范圍:當前shell進程;

  無效范圍: 對當前shell 之外的其它shell 進程,包括當前shell 的子shell 進程均無效。

(3)變量的定義與刪除

顯示定義的所有變量:set.

刪除變量:unset name

由于定義的變量會占用服務器的內存,所以使用完一個變量后要及時刪除。

  2、環境變量:

1)生效范圍:當前shell進程及其子進程。

2)變量聲明:

 export name =VALUE

 declare -x name =VALUE

(3)變量引用:$name, ${name}

(4) 顯示所有環境變量:

export

env

printenv

刪除:unset name

(5)bash 有許多內建的環境變量:PATH, SHELL, USRE,UID,

HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1    

  3、局部變量:

   當前shell進程中某代碼片段(通常指函數)

  4、位置變量:

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

  5、特殊變量:

   $0:命令本身

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

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

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

四、bash 中的算術運算:

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

實現算術運算:

(1) let var= 算術表達式

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

(3) var=$(( 算術表達式))

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

(5) declare i  var =  數值

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

乘法符號有些場景中需要轉義 ,如 如*

 bash 有內建的隨機數生成器:$RANDOM 1-32767

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

賦值

增強型賦值:+=, -=, *=, /=, %=

例如:let count+=3

自加3 后自賦值

自增,自減:

let var+=1

let var++

let var-=1

let var–

五、一些命令的復習

1、顯示磁盤分區情況

圖片2.png 

2、使用export查看環境變量

圖片3.png 

 

3、在腳本代碼中調用通過命令行傳遞給腳本的參數

vim  /root/bin/arg.sh 編輯命令如下

圖片4.png 

然后將參數傳給這個可執行的文件

圖片5.png 

圖片6.png 

                         0810課題練習作業

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

答:先把每條命令寫出來,然后再寫入腳本之中。

顯示主機名:hostname

IPv4地址:ifconfig|sed -n "2p"|tr -s " " ":"|cut -d: -f3

操作系統版本:cat /etc/system-release

內核版本:uname   -r

cpu型號:lscpu|grep "Model name"|cut -d: -f2|sed -r 's@^[[:space:]]{2,}\b@@'

內存大?。?span style="font-family:Calibri">free -m|sed -n "2p"|tr -s " " ":"|cut -d: -f2

硬盤大小:fdisk -l|grep "sda\b"|cut -d, -f1|cut -d: -f2

然后在腳本中進行編輯

1圖片7.png 

顯示結果如下:

圖片7.png 

2 、編寫腳本/root/bin/backup.sh ,可實現每日將/etc/ 目錄

備份到/root/etcYYYY-mm-dd中。

答: cp  -a  /etc/  /root/ etc`date +%F`

圖片8.png 

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

用率最大的值

答:df |grep "sd"|sort -n|head -n 1|tr -s " " ":"|cut -d: -f5

圖片9.png 

圖片10.png 

4 、編寫腳本/root/bin/links.sh, 顯示正連接本主機的每個遠

程主機的IPv4

答:netstat -nt|tr -s " " ":"|cut -d: -f6|grep "[0-9]"

圖片11.png 

圖片12.png 

5、寫一個腳本/root/bin/sumid.sh ,計算/etc/passwd

文件中的第10 個用戶和第20 用戶的ID 之和。

答:先想好如何提取第10個和第20個用戶的ID號。

之后編輯如下的腳本

圖片13.png 

6、寫一個腳本/root/bin/sumspace.sh ,傳遞兩個文件

路徑作為參數給腳本,計算這兩個文件中所有空白行之和。

答:本題涉及傳參數和查找文件空白行。兩步完成組合即可得到想要結果。

答:在vim編輯腳本要注意針對命令,應該使用`,反向單引號。避免使用雙引號出現錯誤。

圖片14.png 

之后在執行命令是傳入參數即可。

圖片15.png 

7、寫一個腳本/root/bin/sumfile.sh, 統計/etc, /var,

/usr目錄中共有多少個一級子目錄和文件

答:首先,要做好每個目錄中的目錄和文件的數量統計,之后編輯文本并傳入參數即可。這樣比較靈活,注意腳本編輯盡量具有通用性,不要”寫死了“。

圖片16.png 

圖片17.png  

8 、寫一個腳本/root/bin/argsnum.sh ,接受一個文件路徑作

為參數;如果參數個數小于1 ,則提示用戶“至少應該給一個

參數”,并立即退出;如果參數個數不小于1 ,則顯示第一個

參數所指向的文件中的空白行數.

答:給定參數,利用比較命令做判斷

圖片18.png 

圖片19.png 

9、寫一個腳本/root/bin/hostping.sh ,接受一個主機的

IPv4 地址做為參數,測試是否可連通。如果能ping 通,則提

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

該 該IP 地址不可訪問”

答:

圖片20.png

圖片21.png 

10、判斷硬盤的每個分區空間和inode的利用率是否大于80,如果是,發郵件通知root磁盤滿。

答:為了簡化代碼,我將inode和磁盤分區的大小全部顯示,當某一數值大于規定值即可發出郵件。

diskorinode=`df|(df;df -i)|grep "sda"|tr -s " " ":" |cut -d: -f5|grep -o "[[:digit:]]\+"|sort -nr|head -n 1`

[ "$diskorinode" -ge 70 ] && echo "the systems disk or inode run out pls check" | mail -s "Waring" root

圖片22.png 

如下為郵件的詳情

圖片23.png 

11、指定文件做為參數,判斷文件是否為.sh后綴,如果是,添加x權限。

答:通過對基名的判斷來確認是否是符合條件的文件。

圖片24.png

12、判斷輸入的IP是否為合法IP

答:#!/bin/bash

read -p "pls input one ipaddress:" ipadr

echo $ipadr|grep -E "^(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>$"     &> /dev/null && echo " this is a legal IP" || echo "this is not a legal IP"

圖片25.png                                     

13、計算1+2+3+…+100

答:

圖片26.png 

圖片27.png 

14、輸入起始值A和最后值B,計算從A+A+1…+(B-1)+B的總和

答:seq -s +1 100|bc

圖片28.png 

 

 

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

(0)
178babyhanggege178babyhanggege
上一篇 2016-08-15 09:24
下一篇 2016-08-15 09:25

相關推薦

  • 第二周作業

    一Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。 which命令:顯示(shell)命令全部的路徑 which [option] programmame […] –skip-alias:忽略別名   whereis命令:搜索二進制程序,源碼,和幫助手冊頁的命令 whereis [option] na…

    Linux干貨 2017-02-18
  • 【招聘】天津/贊普科技股份有限公司/Linux系統運維工程師/6-7k/五險一金

    天津贊普科技股份有限公司——簡稱贊普科技,成立于2003年,坐落于天津市濱海高新區,是一家專業的互聯網綜合服務商,主營數字網絡建設、數據接入及增值服務和智能化網絡產品及服務。歷經11年的發展,贊普科技已成長為高新區科技型小巨人企業、國家高新技術企業,專注于移動互聯與大數據、云計算、商業WIFI行業的領軍者。     贊普科技計劃…

    Linux干貨 2015-12-03
  • 三劍客之Sed

    sed:stream editor(流編輯器) 工作特性:并不直接處理文本文件本身,處理機制為每當處理一個文件的時候,它會逐行讀取,每次把一行讀取到內存空間中去,而后在模式空間(pattern space)中完成編輯.并把編輯好的結果輸出到屏幕上  功      能:數據替換、刪除、增加、等,數據為關鍵字或者一整行, …

    Linux干貨 2016-08-08
  • vim、crontab、bash for循環練習

    1、復制/etc/rc.d/init.d/functions文件至/tmp目錄,將/tmp/functions文件中的以至少一個空白字符開頭的行的行首加#。 vim中支持全文查找替換功能且在查找時支持正則表達式,在替換時進行引用。先使用vim /tmp/functions,然后在vim編輯模式中輸入:%s/\(^[[:space:]]\+\)/#\1/g再回…

    系統運維 2016-12-03
  • 馬哥教育-第二周作業

    問題一:文件管理類命令 常規命令:mkdir、rmdir、stat、touch、copy、mv、rm (1).mkdir  創建目錄: 注意:路徑基名方為命令的作用對象;基名之前的路徑必須得存在; -p:自動按需創建父目錄; -v:顯示創建過程; -m 參數:直接給定所需權限; 例子:問題:創建 /tmp/x ; /tmp/x/y1 ; /tmp/…

    Linux干貨 2016-12-11
  • mysql基礎

      mysql基礎 數據模型: 數據模型:層次模型、網狀模型、關系模型、…… 關系模型: 二維關系:表     行:row, entity     列:colume, attribution 索引:數據結構,輔助完成數據查找;  &nbsp…

    Linux干貨 2016-11-01

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-15 10:07

    心態上干勁十足,學習中認真踏實,博客作業完成的還不錯。

欧美性久久久久