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@@'

內存大小:free -m|sed -n "2p"|tr -s " " ":"|cut -d: -f2

硬盤大?。?span style="font-family:Calibri">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
下一篇 2016-08-15

相關推薦

  • 計算1000以內的總質數個數

    #include <stdio.h> int main() { int micro[500]; // 質數保存素組 int number = 0; // 質數個數 micro[number++] = 2; // micro[0]=2 micro[number++] = 3; // micro[1]=3, number=2 unsigned lon…

    Linux干貨 2017-03-22
  • 讓自定義腳本成為服務腳本

    1.腳本注釋格式:此格式能讓chkconfig命令識別 #!/bin/bash#chkconfig:runlevel [S]##  [K]##    定義默認runlevel) (S開頭,定義啟動優先級) (K開頭,定義關閉優先級) #description:腳本說明:太長的話需要\換行 2.case語句實現start,stop…

    Linux干貨 2017-05-15
  • ifcfg家族命令介紹

    ifcfg家族命令: ifconfig ifconfig [interface] add<地址>:設置網絡設備IPv6的ip地址; del<地址>:刪除網絡設備IPv6的IP地址; down:關閉指定的網絡設備;<硬件地址>:設置網絡設備的類型與硬件地址; io_addr:設置網絡設備的I/O地址; irq:設置…

    Linux干貨 2016-07-29
  • Redis學習手冊(持久化)

    一、Redis提供了哪些持久化機制:     1). RDB持久化:     該機制是指在指定的時間間隔內將內存中的數據集快照寫入磁盤。         2). AOF持久化:     該機制將以日志…

    Linux干貨 2015-02-25
  • iptables實戰筆記一

    iptables實戰 1.開啟防火墻 systemctl start firewalld 2.清空所有的默認規則,我們自己定義自己的規則 iptables -F 查看此時的iptables iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination Chain FOR…

    Linux干貨 2017-06-13
  • 文件查找:find命令、locate命令;Linux文件系統上的權限

    文件查找:find、locate locate:依賴事先構建的索引,是在系統空閑周期性自動進行;手動更新(updatedb);極其消耗資源;   find [option]… [查找路徑] [查找條件] [處理動作] 查找條件: 根據文件名查找: -name “文件名稱”:支持使用通配符glob(*,?,[],[…

    Linux干貨 2017-12-14

評論列表(1條)

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

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

欧美性久久久久