Shell編程學習之一python
1、腳本的書寫和執行shell
腳本第一行,頂格:#!/bin/bash編程
其中 #!稱之爲shebang,LinuxOS會的程序載入器會分析shebang後的內容,將這些內容做爲解釋器的指令。常見的有:#!/bin/bash,#!/usr/bin/python等。bash
以#開頭的行都是註釋的行,會被解釋器忽略。ide
其餘就是腳本的主要內容了,主要是由許多命令組成的。oop
腳本語法檢查:bash -n 腳本名 例如:bash -n httpd學習
執行: bash 腳本名 或者 給腳本x權限;寫出腳本的路徑執行 測試
bash -n 單步執行,能夠看到腳本執行過程當中的每一步ui
2、shell腳本執行過程spa
順序執行:從上到下依次執行
選擇執行:根據測試條件執行,知足某個測試條件是,執行對應的分支
循環執行:將一段代碼反覆執行屢次。根據循環退出條件退出。
3、shell的變量類別
本地變量,環境變量,局部變量,位置變量,特殊變量。這裏可能位置變量和特殊變量使用較多一些。例如:S#(參數個數),$@ $*(參數列表)。具體表明的意義請參照http://guoting.blog.51cto.com/8886857/1433602裏面所說明的。
4、循環語句
常見的循環語句有for,while,until。循環的主要意義在於,重複執行近似的代碼,提升代碼利用率。
1)for循環:遍歷有限個元素列表
for語句的語法格式:
for VAR_NAME in LIST
do
do something
done
退出條件:遍歷完LIST中的全部元素
如何生成數值列表
一、{start..end} 例如{100..120}表明初始值是100,步長是1,最大值是120的整數。
二、命令引用 `seq [start [increment]] end`
seq 12 :表示初始值是1,步長是1,最大值是12的整數
seq 12,24 :表示初始值是12,步長是1,最大值是34的整數
seq 12,3,24 :表示初始值是12,步長是3,最大值是34的整數
生成列表的方式:
一、手動給個列表:
for i in 1 2 3 4 5
二、數值列表:
{start..end}
`seq [start [increment]] end`
三、$*, $@ :調用腳本參數的列表
四、命令生成列表 例如:`ls /path/to/where`
for的另外一種格式,此種格式更接近C語言的for語句,格式以下:
for(( 初始條件;測試條件;修改表達式));do
循環體
done
例如:求1到100的整數之和
#!/bin/bash # description:sum 1..100 # version:0.0.0 # date:2014-07-14 # author: Alex # license: GPL let sum=0 for ((i=0;$i <= 100;i++));do let sum+=$i done echo $sum
bash如何實現算術運算:
一、定義×××變量的方法:
let VAR_NAME=VALUE 例如: let sum=0
declare -i VAR_NAME=VALUE 例如:declare -i sum=0
注意:即便沒有定義爲整型變量,字符型的數字依然能夠參與算術運算;bash會執行變量類型的隱式類型轉換;
二、實現算術運算的方式:
let VAR_NAME=ARITHMATIC_EXPRESSION
VAR_NAME=$[ARITHMATIC_EXRESSION]
VAR_NAME=$((EXPRESSION))
VAR_NAME=$(expr $num1 + $num2)
例如:實現算術3+2
let sum=3+2
sum=$[3+2]
sum=$((3+2))
sum=$(expr 3 + 2) 注意:這裏的空格
三、常見的算術運算符
通常的算術運算符:+ - * / % **(乘方)
加強型的算術運算符:++ += *= /= %=
這些都是雙目運算符。
練習:寫一個腳本,知足如下要求:
一、建立用戶tuser501-tuser510;
二、建立目錄/tmp/dir-當前日期時間;
三、在/tmp/dir-當前日期時間 目錄中建立9個空文件file101-file110
四、將file101的屬主改成tuser501,依次類推,一直將file110的屬主改成tuser510;
#!/bin/bash # Name:tuser501-510.sh # Description: testing # Version: 0.0.1 # Author: Alex # Date: 2014-07-08 dir_name="/tmp/dir-`date +%Y%m%d-%H%M%S`" /bin/mkdir $dir_name for num in {101..110};do /bin/touch $dir_name/file$num user_num=$[$num+400] /usr/sbin/useradd tuser$user_num &>/dev/null /bin/chown tuser$user_num $dir_name/file$num done echo "The result:" /bin/ls -l $dir_name [root@server scripts]# chmod +x tuser501-510.sh [root@server scripts]# bash -n tuser501-510.sh [root@server scripts]# ./tuser501-510.sh The result: total 0 -rw-r--r-- 1 tuser501 root 0 Jul 9 11:33 file101 -rw-r--r-- 1 tuser502 root 0 Jul 9 11:33 file102 -rw-r--r-- 1 tuser503 root 0 Jul 9 11:33 file103 -rw-r--r-- 1 tuser504 root 0 Jul 9 11:33 file104 -rw-r--r-- 1 tuser505 root 0 Jul 9 11:33 file105 -rw-r--r-- 1 tuser506 root 0 Jul 9 11:33 file106 -rw-r--r-- 1 tuser507 root 0 Jul 9 11:33 file107 -rw-r--r-- 1 tuser508 root 0 Jul 9 11:33 file108 -rw-r--r-- 1 tuser509 root 0 Jul 9 11:33 file109 -rw-r--r-- 1 tuser510 root 0 Jul 9 11:33 file110 [root@server scripts]#
2)while,until語句
while語句的語法格式:
while 測試條件 ;do
循環體
done
until語句的語法格式:
until 測試條件 ;do
循環體
done
while的執行過程是當測試條件爲真,執行循環體語句,執行完成之後再判斷測試條件,直到測試條件爲假的時候退出。until的執行過程與while執行過程相似,主要區別是測試條件爲假的時候執行循環體,測試條件爲真的時候退出循環體。
while能夠直接遍歷文件,這在咱們之後寫腳本的過程當中可能隨時會用到。
格式:
while read VAR_NAME ;do
循環體
done < /path/to/somefile
練習:求100之內全部偶數整數之和
#!/bin/bash # description: the sum even of 1 to 100 # version:0.0.1 # date:2014-07-10 # author: Alex #定義求和存儲變量 declare -i sum=0 #定義計數器變量,通常whlie或者是until都會引入像計數器這種機制,這樣是爲了更好的實現退出 let count=0 while [ $count -le 100 ];do #循環測試條件 let rst=$count%2 #判斷是否爲偶數 也能夠這樣 res=$[$count%2] #若是是偶數,則求和。這是一種短路運算,等價於if語句 # if [ $rst -eq 0 ];then # let sum+=$count #fi [ $rst -eq 0 ] && let sum+=$count let count++ #實現計數 done #輸出求和結果 echo "The sum is $sum." ##until語句只須要將測試條件變爲 [ $count -gt 100 ] 便可
練習:顯示磁盤使用超過10%的磁盤設備和具體使用率。
#!/bin/bash # version:0.0.0 # date:2014-07-14 # author: Alex # license: GPL df | sed 1d > /tmp/res.txt #df | grep -v "Use" > /tmp/res.txt echo -e "\033[31mDisk Usage(Use > 10%):\033[0m" while read loop ;do [ `echo $loop | tr -s ' '| cut -d ' ' -f5 | tr -d '%' | grep -v "Use"` -gt 10 ] && \ echo $loop | tr -s ' '| cut -d ' ' -f1,5 done < /tmp/res.txt rm -f /tmp/res.txt #此腳本還有缺陷(像 df 命令的結果有時一個設備的信息分佈在2行的狀況下,此腳本還不能處理),目的是說明while是如何遍歷文件的。
腳本執行結果:
補充:
有時候咱們須要執行一個死循環,這就要用到 true 和 : 命令。true 命令的做用是隻返回命令狀態值 0 。與之對應的是 false,它的做用只返回命令狀態值 1。:命令的做用是什麼都不幹的命令。
在循環中,有時可能會用到如下命令:
trap 'CMD1;CMD2' 信號量
break 在腳本中通常與循環一塊兒使用,用於跳出本層循環
continue 在腳本中的做用是跳過本次循環循環,直接進入到下次循環。
具體示例:
#!/bin/bash echo "########### test break and trap ##################" read -p "Plz enter a username: " userName # 捕獲 Ctrl + C 信號 trap 'echo "quit";exit 3' INT # while : ;do while true; do if who | grep "\<$userName\>" &> /dev/null; then break fi echo "wait..." sleep 5 done echo "$userName is logged." # 求 100 之內的全部奇數之和 echo "########### continue ##################" for loop in {1..100};do if [ $[$loop%2] -eq 0 ] ;then continue else let sum+=$loop fi done echo "The sum is $sum."