过程式编程语言:顺序执行,选择执行,循环执行
1.if语句:条件选择
(1) 执行机制:逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
- && 代表and
- || 代表or
(2)单分支
if 判断条件;then
条件为真的分支代码
fi
(3)双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
(4)多分支
if 判断条件1; then
条件为真的分支代码
elif 判断条件2; then
条件为真的分支代码
elif 判断条件3; then
条件为真的分支代码
else
以上条件都为假的分支代码
fi
(5)If示例
根据命令的退出状态来执行命令
if ping -c1 -W2 station1 &> /dev/null; then
echo 'Station1 is UP'
elif grep "station1" ~/maintenance.txt &> /dev/null
then
echo 'Station1 is undergoing maintenance‘
else
echo 'Station1 is unexpectedly DOWN!'
exit 1
fi
2.case语句:条件判断
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
eg:打印棋盘
#!/bin/bash
for i in $(seq 16);do
let m=$i%4
case $m in
1|2)
for j in $(seq 4);do
echo -ne "\033[42m \033[0m"
echo -ne "\033[46m \033[0m"
done
;;
3|0)
for j in $(seq 4);do
echo -ne "\033[46m \033[0m"
echo -ne "\033[42m \033[0m"
done
;;
esac
echo
done
运行结果:
3.for循环
(1) 执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执
行一次循环体; 直到列表中的元素耗尽,循环结束
for 变量名 in 列表;do
循环体
done
(2)列表生成方式:
(1) 直接给出列表
(2) 整数列表:
(a) {start..end}
(b) $(seq [start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob,如:*.sh
(5) 变量引用;
$@, $*
(3)for循环的特殊格式:
- 双小括号方法,即((…))格式,也可以用于算术运算
- 双小括号方法也可以使bash Shell实现C语言风格的变量操作I=10((I++))
for ((控制变量初始化;条件判断表达式;控制变量的修正表达
式))
do
循环体
done
控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
eg:打印99乘法表
#!/bin/bash
for i in {1..9};do
for j in `seq $i`;do
let n=i*j
echo -en "$j*$i=$n\t"
done
echo
done
运行结果:
eg:打印等腰三角形
#!/bin/bash
if [ $# -eq 0 ];then # $#代表所有参数个数
read -p "please input lines:" lines; #提示输入参数
else
lines=$1 #把第一个参数赋值给lines
fi
if [[ $lines =~ ^[0-9]+$ ]] ;then #判断是不是输入的数字
[ $lines -eq 0 ] && { echo lines can not is zero;exit 1; }
else
echo lines must is digit
exit 2
fi
for i in `seq $lines`;do
for space in `seq $[lines-i]`;do
echo -n " "
done
for star in `seq $[2*i-1]`;do
declare -i N=$(($RANDOM%7+30))
if [[ $N -gt 31 && $N -lt 37 ]];then
echo -e "\033[1;${N};5m*\c\0mm"
else
echo -e "\033[31;5m*\c\0mm"
fi
done
echo
done
运行结果:
4.while循环
while CONDITION; do
循环体
done
CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,
则执行一次循环;直到条件测试状态为“false”终止循环因此:CONDTION一般应该有循环控制变量;而此变
量的值会在循环体不断地被修正
进入条件:CONDITION为true
退出条件:CONDITION为false
while循环的特殊用法(遍历文件的每一行):
while read line; do
循环体
done < /PATH/FROM/SOMEFILE
依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line
eg:打印棋盘
#!/bin/bash
i=0
while [ $i -lt 8 ];do
j=0
while [ $j -lt 8 ];do
let flags=(i+j)%2
if [ $flags -eq 0 ];then
echo -en "\033[42m \033[0m"
else
echo -en "\033[46m \033[0m"
fi
let j++
done
echo
let i++
done
运行结果:
#!/bin/bash
i=0
while [ $i -lt 8 ];do
let a=$i%2
if [ $a -eq 0 ];then
j=0
while [ $j -lt 8 ];do
echo -en "\033[46m \033[0m"
echo -en "\033[42m \033[0m"
[ $j -eq 3 ] && echo
[ $j -eq 7 ] && echo
let j++
done
else
j=0
while [ $j -lt 8 ];do
echo -en "\033[42m \033[0m"
echo -en "\033[46m \033[0m"
[ $j -eq 3 ] && echo
[ $j -eq 7 ] && echo
let j++
done
fi
let i++
done
运行结果:
5.until循环
until CONDITION; do
循环体
done
进入条件: CONDITION 为false
出条件: CONDITION 为true
6.循环控制语句continue
- 用于循环体中
- continue [N]:提前结束第N层的本轮循环,而直接进入下一
轮判断;最内层为第1层
eg:
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
7.循环控制语句break
用于循环体中
break [N]:提前结束第N层循环,最内层为第1层
eg:
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
break
fi
CMDn
...
done
8.循环控制shift命令
- shift [n]
用于将参量列表 list 左移指定次数,缺省为左移一次。
参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到 shift
eg:
./doit.sh a b c d e f g h
./shfit.sh a b c d e f g h
doit.sh
#!/bin/bash
# Name: doit.sh
# Purpose: shift through command line arguments
# Usage: doit.sh [args]
while [ $# -gt 0 ] # or (( $# > 0 ))
do
echo $*
shift
done
shift.sh
#!/bin/bash
#step through all the positional parameters
until [ -z "$1" ]
do
echo "$1"
shift
done
echo
eg:创建用户
#!/bin/bash
while [ $# -gt 0 ] #or (( $# > 0 ))
do
id $1 &>/dev/null && continue
useradd $1 && echo $1 is create
shift
done
9.创建无限循环
while true; do
循环体
done
until false; do
循环体
Done
10.select循环与菜单
select variable in list
do
循环体命令
done
select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示 PS3 提示符,等待用户输入
用户输入菜单列表中的某个数字,执行相应的命令
用户输入被保存在内置变量 REPLY 中
select与case
(1)select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止脚本。也可以按 ctrl+c退出循环
(2)select 经常和 case 联合使用
(3)与 for 循环类似,可以省略 in list,此时使用位置参量
#!/bin/bash
PS3="Please choose your menu:"
select menu in lamian humian yangroutang;do
case $REPLY in
1)
echo "The price is \$5"
;;
2)
echo "The price is \$6"
;;
3)
echo "The price is \$8"
;;
*)
echo "we haven't"
break
;;
esac
done
运行结果: