|
bash脚本编程
while condition; do
循环体
done
until condition; do
循环体
done
示例:求100以内所有正整数的和:
#!/bin/bash
declare -i i=1
declare -i sum=0
while [ $i -le 100 ]; do
let sum+=$i
let i++
done
echo "Sum: $sum"
******************************************
#!/bin/bash
declare -i i=1
declare -i sum=0
until [ $i -gt 100 ]; do
let sum+=$i
let i++
done
echo "Sum:$sum"
**************************************
示例:打印九九乘法表
#!/bin/bash
declare -i j=1
declare -i i=1
until [ $j -gt 9 ]; do
until [ $i -gt $j ]; do
echo -n -e "${i}X${j}=$[$i*$j]\t"
let i++
done
echo
let i=1
let j++
done
************************************
#!/bin/bash
declare -i i=1
declare -i j=1
while [ $i -le 9 ]; do
while [ $j -le $i ]; do
echo -n -e "${j}*${i}=$[$i*$j]\t"
let j++
done
echo
let i++
let j=1
done
*************************************
循环控制语句(用于循环体中):
continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;
while CONDITION; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
break [N]:提前结束循环;
while CONDITION; do
CMD1
...
if CONDITION2; then
break
fi
CMDn
...
done
示例:求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"
示例:每隔3秒钟到系统上获取已经登录的用户信息,如果docker登录了,则记录于日志中,并退出
#!/bin/bash
read -p "Enter a user name:" username
while true; do
if who|grep "^$username" &> /dev/null; then
break
fi
sleep 3
done
echo "$username logged on." >> /tmp/user.log
************************************************
#!/bin/bash
read -p "Enter a user name:" username
until who|grep "^username" &> /dev/null; do
sleep 3
done
echo "$username logged on." >> /tmp/user.log
while 循环的特殊用法(遍历文件的每一行):
while read line; do
循环体
done < /path/from/filename
依次读取file文件中的每一行,将值赋给变量line
#!/bin/bash
while read line; do
if [ $[`echo $line |cut -d: -f3` % 2] -eq 0 ]; then
echo -e -n "username: `echo $line | cut -d: -f1`\t "
echo "uid: `echo $line | cut -d: -f3`"
fi
done < /etc/passwd
*********************************************
for 循环体特殊格式:
for((变量初始化;条件判断表达式;控制变量修正表达式)); do
循环体
done
示例:求100以内所有正整数的和:
#!bin/bash
declare -i sum=0
for((i=1;i<=100;i++)); do
let sum+=$i
done
echo "Sum: $sum"
示例:打印九九乘法表
#!/bin/bash
for((j=1;j<=9;j++)); do
for((i=1;i<=j;i++)); do
echo -e -n "${i}*${j}=$[$i*$j]\t"
done
echo
done
编写脚本:
1.显示一个菜单:
cpu) show cpu information;
mem) show memory information;
disk) show disk informationl
quit) quit
2.提示用户选择选项
3.显示用户选择的内容
#!/bin/bash
cat <<EOF
=================================
cpu) show cpu information;
mem) show memory information;
disk) show disk informationl
quit) quit
==================================
EOF
read -p "enter a option:" option
while [ "$option" != 'cpu' -a "$option" != 'mem' -a "$option" != 'disk' -a "$option" != 'quit' ]; do
read -p "wrong option, enter again:" option
done
if [ "$option" == 'cpu' ]; then
lscpu
elif [ "$option" == 'mem' ]; then
cat /proc/meminfo
elif [ "$option" == 'disk' ]; then
fdisk -l
else
echo "quit"
exit0
fi
条件判断:case 语句
case 变量引用 in
pat1)
...
;;
pat2)
...
;;
*)
默认分支
;;
esac
#!/bin/bash
cat <<EOF
=================================
cpu) show cpu information;
mem) show memory information;
disk) show disk informationl
quit) quit
==================================
EOF
read -p "enter a option:" option
while [ "$option" != 'cpu' -a "$option" != 'mem' -a "$option" != 'disk' -a "$option" != 'quit' ]; do
read -p "wrong option, enter again:" option
done
case "$option" in
'cpu')
lscpu
;;
'mem')
cat /proc/meminfo
;;
'disk')
fdisk -l
;;
*)
echo "quit"
exit0
;;
esac
编写一个脚本
1.脚本可接受参数: start, stop, restart, status;
2.如果参数非此四者之一,提示使用格式后报错退出
3.如果是start;则创建/var/lock/subsys/SCRIPT_NAME,便显示启动成功
4.如果是stop,则删除/var/lock/subsys/SCRIPT_NAME,并显示停止完成
5.如果是restart,则先stop,再start
6.如果是status,则
如果/var/lock/subsys/SCRIPT_NAME文件存在,显示 running
如果/var/lock/subsys/SCRIPT_NAME文件不存在,显示stopped
其中:SCRIPT_NAME 为当前脚本名字
|
|