1. 程式人生 > >謝煙客---------Linux之腳本編程---until,for,case

謝煙客---------Linux之腳本編程---until,for,case

linux

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

until循環

while CONDITION; do
condition-ture
done
為真時,進入循環
until CONDITION; do
循環體
done
為假時,進入循環


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

循環控制命令、語句:用於循環體中,用在條件判斷的表達式上

continue [#]
默認當前"循環體",提前結束
# 提前結束#層循環體
break [#]
默認當前"循環",提前結束
# 提前結束#層循環


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

創建死循環(註意會耗盡cpu時鐘周期的..)

while true; do
循環體
done
until false; do
循環體
done


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

while遍歷指定文件的每一行

while read line; do
循環體
done < /PATH/FROM/SOMEFILE

將行賦值給line變量

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

C風格的for用法

避免了for生成列表,會消耗大量的內存空間

for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式)); do
循環體
done


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

條件判斷case

case 變量引用 in
pattern)
statement
;;
pattern)
statement
;;
...
*)
statement
;;
esac

pattern支持 glob



until練習

示例:求100以內所有正整數和

示例:9x9

示例: 添加10個用戶 user1-user10


continue、break練習

示例1:求100以內所有偶數之和,要求循環遍歷100以內所有正整數

示例2:每3秒判斷一次docker用戶,如果docker用戶登陸,則記錄目誌並退出循環


while遍歷文件練習

示例:將ID號為偶數的所有用戶,顯示其用戶的用戶名


C風格的for用法

示例: 9x9乘法表

練習:

1、顯示菜單

cpu) show cpu infomation

mem) show memory information

disk) show disk information

quit) quit


2、提示用戶選擇選項

3、顯示用戶選擇的內容


進一步地:

用戶選擇,並顯示完成後不退出腳本,而是提示用戶繼續選擇顯示其它內容,直到使用quit退出


條件判斷case

練習:

1)腳本可接受參數, start,stop,restart,status

2)非4者之一,提示使用格式並退出

3)start時,創建/var/lock/subsys/SCRIPT_NAME,並顯示"啟動成功"

考慮:事先啟動過一次,該如何處理

4)stop時,則刪除/var/lock/subsys/SCRIPT_NAME,並顯示"停止完成"

考慮:如果事先已然停止過了,該如何處理?

5)restart時,先stop,再start

考慮:如果本來沒有start,如何處理

6)如何是status,

/var/lock/subsys/SCRIPT_NAME文件存在,則顯示"SCRIPT_NAME is running..."

/var/lock/subsys/SCRIPT_NAME文件不存在,則顯示"SCRIPT_NAME is stopped..."


其中:SCRIPT_NAME為當前腳本名。$0


until練習

1、

示例:求100以內所有正整數和
#!/bin/bash
#
declare -i i=1
declare -i sum=0
until [ $i -gt 100 ]; do
sum=$[$sum+$i]
let i++
done
echo "sum: $sum"

2、

示例:9x9
#!/bin/bash
#
declare -i i=1
until [ $i -gt 9 ]; do
declare -i j=1
until [ $j -gt $i ]; do
echo -n -e "${j}X${i}=$(expr $i \* $j)\t"
let j++
done
echo
let i++
done

3、

示例: 添加10個用戶 user1-user10
#!/bin/bash
#
declare -i i=1
declare -i users=0
until [ $i -gt 10 ]; do
if ! id user$i &> /dev/null; then
useradd user$i
echo "Add user user$i finished"
let users+=1
fi
let i++
done


continue、break練習

1、

示例1:求100以內所有偶數之和,要求循環遍歷100以內所有正整數
#!/bin/bash
#
declare -i i=0
declare -i sum=0
until [ $i -gt 100 ]; do
let i++
if [ $[$i%2] -eq 1 ]; then
continue
fi
let sum+=$i
done
echo "Even sum: $sum"

2、

示例2:每3秒判斷一次docker用戶,如果docker用戶登陸,則記錄目誌並退出循環
#!/bin/bash
#
if [ -z "$1" -o "$1" == "--help" ]; then
echo "Usage: $0 <username>"
exit 1
fi
if ! id $1 &> /dev/null; then
echo "$1 is not exist"
exit 2
fi
until false; do
sleep 3
if who | grep "^$1\>" &> /dev/null; then
break
fi
done
echo "$1 login at $(date +%F_%T)" >> /tmp/user_login.log
判斷: # bash -n a.sh
運行: # bash a.sh docker &


while遍歷文件練習

1、

示例:將ID號為偶數的所有用戶,顯示其用戶的用戶名
#!/bin/bash
#
declare -i sum=0
while read line; do
if [ $[$(echo $line | cut -d‘:‘ -f3)%2] -eq 0 ]; then
echo -e "$(echo $line | cut -d‘:‘ -f1,3 --output-delimiter=‘ ‘)\t"
sum=$(($sum+1))
fi
done < /etc/passwd
echo "Even sum of users: $sum"

C風格的for用法

1、

示例演示: 求100以內所有正整數之和
#!/bin/bash
#
declare -i sum=0
for ((i=1;i<=100;i++)); do
let sum+=$i
done
echo "sum: $sum"

2、

示例: 9x9乘法表
#!/bin/bash
#
for ((i=1;i<=9;i++)); do
for ((j=1;j<=i;j++)); do
echo -e -n "${j}X${i}=$[$i*$j]\t"
done
echo
done

3、

練習:
1、顯示菜單
cpu) show cpu infomation
mem) show memory information
disk) show disk information
quit) quit
2、提示用戶選擇選項
3、顯示用戶選擇的內容
進一步地:
用戶選擇,並顯示完成後不退出腳本,而是提示用戶繼續選擇顯示其它內容,直到使用quit退出
#!/bin/bash
#
while true; do
cat << EOF
cpu) show cpu infomation
mem) show memory information
disk) show disk information
quit) quit
EOF
read -p ‘Enter a your choice: ‘ key
case $key in
cpu)
x86info
;;
mem)
vmstat -s
;;
disk)
fdisk -l /dev/[sh]d[a-z]
;;
quit)
exit 0
;;
*)
echo "only cpu | mem | disk | quit"
continue
;;
esac
done

條件判斷case

1、

練習:
1)腳本可接受參數, start,stop,restart,status
2)非4者之一,提示使用格式並退出
3)start時,創建/var/lock/subsys/SCRIPT_NAME,並顯示"啟動成功"
考慮:事先啟動過一次,該如何處理
4)stop時,則刪除/var/lock/subsys/SCRIPT_NAME,並顯示"停止完成"
考慮:如果事先已然停止過了,該如何處理?
5)restart時,先stop,再start
考慮:如果本來沒有start,如何處理
6)如何是status,
/var/lock/subsys/SCRIPT_NAME文件存在,則顯示"SCRIPT_NAME is running..."
/var/lock/subsys/SCRIPT_NAME文件不存在,則顯示"SCRIPT_NAME is stopped..."
其中:SCRIPT_NAME為當前腳本名。$0
#!/bin/bash
# chkconfig: - 88 12
# description: Lcc.org
#########################
SrvName=$(echo $0 | sed ‘s,/$,,‘ | sed -r ‘s|(.*/)([^/]+)|\2|‘)
Lockfile=/var/lock/subsys/$SrvName
#########################
unset Start Stop Restart Stauts Other
declare -i Start=1
declare -i Stop=1
declare -i Restart=1
declare -i Stauts=1
declare -i Other=1
case $1 in
start)
Start=0
;;
stop)
Stop=0
;;
restart)
Restart=0
;;
status)
Status=0
;;
*)
Other=0
;;
esac
if [ "$Start" == 0 ]; then
[ ! -e $Lockfile ] && touch $Lockfile
    echo "$0 start finished"
fi
if [ "$Stop" == 0 ]; then
[ -e $Lockfile ] && rm -rf $Lockfile
    echo "$0 stop finished"
fi
if [ "$Restart" == 0 ]; then
[ -e $Lockfile ] && rm -rf $Lockfile
    echo "$0 stop finished"
[ ! -e $Lockfile ] && touch $Lockfile
    echo "$0 start finished"
fi
if [ "$Status" == 0 ]; then
    [ -e $Lockfile ] && echo "$0 is running...." || echo "$0 is stopped..."
fi
if [ "$Other" == 0 ]; then
    echo "Usage:$0 {start|restart|stop|status}"
    exit 1
fi

後續步驟
1、查看腳本語法
# bash -n x.sh
2、給予執行權限
# chmod +x x.sh
嘗試加入服務
1、明確腳本是否遵循LSB風格
# chkconfig: - 88 12
# description: lcc.org 
2、復制至/etc/rc.d/init.d/目錄中
# cp x.sh /etc/init.d/
3、加入服務中
# chkconfig --add x.sh
查看服務:
# chkconfig --list x.sh
    [[email protected] bin]# chkconfig --list x.sh
    x.sh           0:off1:off2:off3:off4:off5:off6:off
讓2345級別處於on狀態
#  chkconfig --levels 2345 x.sh on
    [[email protected] bin]# chkconfig --list x.sh
        x.sh           0:off1:off2:on3:on4:on5:on6:off
測試用service控制
開啟服務:service x.sh start
關閉服務: service x.sh stop
查看狀態: service x.sh status
重啟服務: service x.sh restart

技術分享

本文出自 “Reading” 博客,請務必保留此出處http://sonlich.blog.51cto.com/12825953/1964166

謝煙客---------Linux之腳本編程---until,for,case