shell腳本編程初步
隨著課程學習的深入,我們已經學習了一些常用的命令,會去解決了一部分簡單的問題,但是這不能滿足復雜的工作,它可以幫助我執行自動化的常用命令、執行系統管理和故障排除、創建簡單的應用程序、處理文本或文件。所以我們開始了shell腳本的編程,幫助我們更好的去完成工作。簡單地說,shell編程相當于幫我們之前學習的許多命令進行了深度的結合。
一、shell腳本基礎界面
shell腳本是包含一些命令或聲明,并符合一定格式的文本
格式要求:首行shebang機制
如:#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
我們打開一個腳本查看一下,例如打開/root/bin/AandB.sh
第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、使用export查看環境變量
3、在腳本代碼中調用通過命令行傳遞給腳本的參數
vim /root/bin/arg.sh 編輯命令如下
然后將參數傳給這個可執行的文件
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
然后在腳本中進行編輯
顯示結果如下:
2 、編寫腳本/root/bin/backup.sh ,可實現每日將/etc/ 目錄
備份到/root/etcYYYY-mm-dd中。
答: cp -a /etc/ /root/ etc`date +%F`
3 、編寫腳本/root/bin/disk.sh, 顯示當前硬盤分區中空間利
用率最大的值
答:df |grep "sd"|sort -n|head -n 1|tr -s " " ":"|cut -d: -f5
4 、編寫腳本/root/bin/links.sh, 顯示正連接本主機的每個遠
程主機的IPv4。
答:netstat -nt|tr -s " " ":"|cut -d: -f6|grep "[0-9]"
5、寫一個腳本/root/bin/sumid.sh ,計算/etc/passwd
文件中的第10 個用戶和第20 用戶的ID 之和。
答:先想好如何提取第10個和第20個用戶的ID號。
之后編輯如下的腳本
6、寫一個腳本/root/bin/sumspace.sh ,傳遞兩個文件
路徑作為參數給腳本,計算這兩個文件中所有空白行之和。
答:本題涉及傳參數和查找文件空白行。兩步完成組合即可得到想要結果。
答:在vim編輯腳本要注意針對命令,應該使用`,反向單引號。避免使用雙引號出現錯誤。
之后在執行命令是傳入參數即可。
7、寫一個腳本/root/bin/sumfile.sh, 統計/etc, /var,
/usr目錄中共有多少個一級子目錄和文件
答:首先,要做好每個目錄中的目錄和文件的數量統計,之后編輯文本并傳入參數即可。這樣比較靈活,注意腳本編輯盡量具有通用性,不要”寫死了“。
8 、寫一個腳本/root/bin/argsnum.sh ,接受一個文件路徑作
為參數;如果參數個數小于1 ,則提示用戶“至少應該給一個
參數”,并立即退出;如果參數個數不小于1 ,則顯示第一個
參數所指向的文件中的空白行數.
答:給定參數,利用比較命令做判斷
9、寫一個腳本/root/bin/hostping.sh ,接受一個主機的
IPv4 地址做為參數,測試是否可連通。如果能ping 通,則提
示用戶“該IP 地址可訪問” ;如果不可ping 通,則提示用戶“
該 該IP 地址不可訪問”
答:
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
如下為郵件的詳情
11、指定文件做為參數,判斷文件是否為.sh后綴,如果是,添加x權限。
答:通過對基名的判斷來確認是否是符合條件的文件。
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"
13、計算1+2+3+…+100
答:
14、輸入起始值A和最后值B,計算從A+(A+1)…+(B-1)+B的總和
答:seq -s “+” 1 100|bc
原創文章,作者:178babyhanggege,如若轉載,請注明出處:http://www.www58058.com/34922
心態上干勁十足,學習中認真踏實,博客作業完成的還不錯。