if,case, for,while循环语句
一般来说刚开始学习写循环类脚本,我会写事先写一个脚本语法骨架防止出现一些莫名其妙的语法错误。刚开始学习脚本编写时就因为没注意,出现语法类的错误,找错找半天严重浪费时间。比如写if循环时,忘了添加then,写的急时会将fi忘掉。所以我会事会写:
if in;then
fi
的格式防止自己忘掉,导致语法类的错误
if语句的语法结构:
1.单循环:
if 判断条件 ;then
条件为真的分支代码
in
2.多循环
if 判断条件 in;then
条件为真的分支代码
else
条件为假的分支代码
fi
3.多循环
if 判断条件 ;then
条件为真的分支代码
elif 判断条件 ;then
条件为真的分支代码
else
以上条件为假的分支代码
fi
逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句
例如
编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
if [[ $1 =~ "^[yY]$" ]];then
echo "yes"
elif [[ $1 =~ "^[Yy][Ee][Ss]$" ]];then
echo "yes"
elif [[ $1 =~ "^[Nn]$" ]] ;then
echo no
elif [[ $1 =~ "^[Nn][Oo]$" ]];then
echo no
else
echo "you input error"
fi
不过如果用case在大量罗列更好用
case的语法为:
case 变量 in;do
PATH1)
分支1
;;
PATH)
分支2
;;
*)
默认分支
;;
esac
case支持glob风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
a|b: a或b
所以上面例子可以写成
case $1 in
[Yy]|[Yy][Ee][Ss])
echo yes
;;
[Nn]|[Nn][Oo])
echo no
;;
*)
echo "you input error"
esac
for 循环语法
第一种语法:
for 变量名 in 列表;do
循环体
done
执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束
列表生成方式:
(1) 直接给出列表
(2) 整数列表:
(a) {start..end}
(b) $(seq[start [step]] end)
(3) 返回列表的命令
$(COMMAND)
(4) 使用glob,如:*.sh
(5) 变量引用;
$@, $*
第二种
for (控制变量初始化;条件判断表达式;控制变量的修正表达式);do
循环语句
done
控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断
例如计算1+2+3...+100的和
第一种:
sum=0
i=0
for i in {1..100};done ------>这里也可以写成for i in `seq 100`;done
let sum+=i
let i++
do
echo "sum=$sum"
第二种:
for(i=0,sum=0;i<=100;i++);done
let sum+=i
do
echo "sum=$sum"
当然也可以用while 语句
while语法:
while 判断条件(CONDITON);do
循环体
done
CONDITON:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环
因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正
进入条件:判断条件成功
退出条件:判断条件失败
i=0
sum=0
while ((i<=100));do
let sum+=1
let i++
done
echo sum=$sum
网友评论