Linux Shell編程之一循環結構

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是如何遍歷文件的。

    腳本執行結果:

wKiom1PDy4rASGlJAABmCvQBCHs320.jpg


補充:

    有時候咱們須要執行一個死循環,這就要用到 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."
相關文章
相關標籤/搜索