谢烟客---------Linux之脚本编程---until,for,case

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

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

时间: 2024-10-13 02:34:46

谢烟客---------Linux之脚本编程---until,for,case的相关文章

谢烟客---------Linux之脚本编程---for及while应用

过程式编程 选择执行 顺序执行: if, case 循环执行: for, while, until for循环列表 for i in LIST; do     循环体 done for i in LIST do     循环体 done while循环 while CONDITION; do     循环体 done while CONDITION do     循环体 done CONDITION 循环控制条件,每执行一次循环体,需要再次进行判断     true时,执行一次循环    fal

谢烟客---------Linux之脚本编程---函数

函数.函数名.函数定义.变量作用域.函数返回值.参数.递归 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 函数:一段具有特定功能的代码 函数名:为这段代码所取的名字,可以通过函数名完成特定功能 注意: 函数名出现的地方即为 函数对应的代码替换的地方 (变量名出现的地方即为 变量所对的值替换的地方) 函数的作用: 代码重用:过程式编程中,代码重用的重要组件. 模块化编程: 结构化编程: 函数的特点: 1)没有执行入口,只能被有

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

Linux Shell脚本编程while语句

Linux Shell脚本编程while语句案例 1,每隔3秒,打印一次系统负载 #!/bin/bash while truedo    uptime    sleep 3done 2,把监控结果保存到文件,在后台执行,然后用tail -f监控文件变化[email protected]:~/linux/shell/flow_control$ sh while.sh &[1] 12867 #!/bin/bash while truedo    uptime >> log.txt    s

Linux shell脚本编程基础之练习篇

shell脚本编程基础之练习篇. 1.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. #!/bin/bash if [ $# -ne 1 ] then echo "请输入一个参数" exit else echo "参数正确" newfile=$1 fi #echo `grep "^#\!" ${newfile}` if ! grep "^#\!" ${newfile} &>/

shell脚本编程基础之case语句

基础简介 脚本编程分为: 面向过程 选择结构:if语句,单分支.双分支.多分支:case语句 控制过程:顺序结构(默认) 循环结构 面向对象 case语句结构 case VAR_NAME in var_value1) #value被当做字符一个一个进行比较的:可以使用a-z,A-Z,0-9,[abc] statement1 ... ;; var_value2) statement2 ... ;; *) statement ... ;; esac case示例 Example1: #!/bin/b

Linux Shell脚本编程case条件语句

1,判断一个数字是否则在1,2,3之中. #!/bin/bash read -p "pls input a number:" n case "$n" in 1) echo "变量是1" ;; 2) echo "变量是2" ;; 3) echo "变量是3" ;; *) echo "pls input a number between 1 and 3" exit; esac 2,多级if语

Linux shell脚本编程详解及应用实例

什么是shell脚本? 1.shell脚本:是一种解释型语言,不需要提前进行编译,只需将代码转化成中间代码,边解释边运行,执行效率稍逊于编译型语言,跨平台性好.而编译型语言则需要提前进行编译转化为二进制文件,靠近底层硬件执行效率高,可移植性差. 2.shell的首行严格来说使用shebang机制:由#和!构成的字符序列,在类unix系统中程序的载入器将其后的内容,当做解释器的指令,并将载有shebang文件路径作为解释器的参数,且予以调用. shell及其他解释型语言的一般格式?  #!/bin

linux之shell编程select和case用法

shell里的select用法: 语法: #i/bin/bash select 变量 in 列表 do     要执行的语句      done 举例: #!/bin/bash echo "What is your favourite OS?" select var in "windows" "Linux" "Gnu Hurd" "Free BSD" "Other"; do    ech