您的位置:首页 > 运维架构 > Shell

Linux shell的条件判断、循环语句及实例

2015-09-19 15:12 561 查看
shell条件判断的两个特殊设备
/dev/null
linux系统的空设备,也称为位桶,任何写入其中的数据均会被丢弃当你不想将标准化输出显示或者保存至文件时可以将文件从定向到/dev/null

禁止标准化输出 cat $filename > /dev/null

禁止标准化错误 rm $filename > /dev/null
/dev/zero
Linux的输入设备,可以用他初始化文件,可以无限制输出0, 另一个作用是用0去填充一个指定大小的文件
在条件判断语句中&&表示and ||表示or
脚本位置参数:

在linux中参数位置从命令后起依次往后,分别是0,1,2,3。。
其中特殊变量有:
$?: 命令的状态结果;
$#: 传递给脚本或函数的参数的个数;
$*和$@: 引用传递给脚本或函数的参数列表;
$$:脚本执行时所产生的进程

shift
:代表轮替



与用户交互:
read 用于读取来自键盘的变数

格式: read [-pt] value
-p:后面直接跟提示字符
-t:后面直接接等待的时间『秒数』

[root@iZ28qzns9m4Z bashtest]# echo $a test
whoaaaaa test
[root@iZ28qzns9m4Z bashtest]# read -p "input:" -t 5 a
input:aaaaa
[root@iZ28qzns9m4Z bashtest]# echo $a
aaaaa
[root@iZ28qzns9m4Z bashtest]#
命令引用
格式一: `命令`
格式二:$(命令)

条件判断语句 if,then,case
只有一个判断式的语句格式:

if[条件];then

命令 ==> 当条件为真时执行,若不只一条时用换行符隔开

fi
需要进行判断时:
if [条件];then

条件成立时,需要输入的内容
elif [条件二];then
条件成立时,需要输入的内容
else

条件与条件一、二均不成立时需要输入的内容

fi



case的判断结构也可以用于多分支:
语法格式:

case $变量名称 in

"第一变量内容")command命令;;

"第二变量内容")command命令;;
"第三变量内容")command命令;;
"第四变量内容")command命令;;
...

*)command命令;;===》在以上条件均不匹配的条件下执行

esac:

循环语句:for while until

在linux 循环语句中 list 是一个重 点,他负责循环时所需要的列表元素,是由一个或多个空格或换行符分隔开的字符串组成,把列表的每个字符串逐个赋值给VARIABLE表示的变量;
生成格式:
数字:① list="1 2 3 4 5 6 10" ==》 for var in ${list}
② for var in {1..10}
[root@iZ28qzns9m4Z bashtest]# cat 1for.sh
#!/bin/bash
#
#list="1 2 3 4 5 6 10"  #第一种
#for i in ${list}
#do
#    echo $i
#done
===================================
for i in {1..10}   #第二种
do
echo $i
done

[root@iZ28qzns9m4Z bashtest]#
(2) 直接给出列表
(3) glob
#!/bin/bash
#
for filename in /相对具体的路径/*; do
file $filename
done
注:如果不是相对具体的路径,那么脚本会报错,filename只搜索相对一级路径下的内容不对第二级子目录进行分析






(4) 命令生成

算术运算:
+, -, *, /, %, **

(1) $[$A+$B]
(2) $(($A+$B))
(3) let VARIABLE=$A+$B
(4) VARIABLE=$(expr $A + $B)
增强型赋值:
+=
sum=$[$sum+$i]
let sum+=$i
-=, *=, /=, %=

let count=$[$count+1] --> let count+=1 --> let count++
let count=$[$count-1] --> let count-=1 --> let count--



[root@iZ28qzns9m4Z bashtest]# sh 4for-2.sh
2500
[root@iZ28qzns9m4Z bashtest]# cat 4for-2.sh
#!/bin/bash
sum=0
for i in $(seq 1 2 100)
do
let "sum+=i"
done
echo $sum
[root@iZ28qzns9m4Z bashtest]#
for 运行前测试语句,用于创建重复循环
格式: for var in ${list}

do

循环命令
done
不带列表的for循环
格式: for var
do
循环命令
done

while循环:
while CONDTION;
do

循环体
done
进入条件:当CONDITION为“真”;

退出条件:当CONDITION为“假”;
while CONDITION;

do
循环体
控制变量的修正表达式
done
while :
do
command

done



until 循环:
until命令和while命令类似,while能实现的脚本until同样也可以实现,但区别是until循环的退出状态是不为0,退出状态是为0(与while刚好相反),即whie循环在条件为真时继续执行循环而until则在条件为假时执行循环。
语法格式:
until expression
do
command

done



[root@iZ28qzns9m4Z bashtest]# cat 1until.sh
#!/bin/bash
declare -i sum=0
declare -i i=1
until [[ "$i" -gt 10 ]]
do
let sum+=i
let i++
done
echo $sum
[root@iZ28qzns9m4Z bashtest]# sh -x 1until.sh
+ declare -i sum=0
+ declare -i i=1
+ [[ 1 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 2 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 3 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 4 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 5 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 6 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 7 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 8 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 9 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 10 -gt 10 ]]
+ let sum+=i
+ let i++
+ [[ 11 -gt 10 ]]
+ echo 55
55
[root@iZ28qzns9m4Z bashtest]#
循环控制:
continue
:提前结束本轮循环,而直接进入下一轮;

break
:提前结束循环;


while循环:
while CONDITION; do
.......
if CONDITION2; then
break

fi
done
[root@iZ28qzns9m4Z bashtest]# cat 1until.sh
#!/bin/bash
declare -i sum=0
declare -i i=1
until [[ "$i" -gt 10 ]]
do
let sum+=i
let i++
if [ $i -eq 5 ]; then
break
fi
echo $sum
done
[root@iZ28qzns9m4Z bashtest]# sh -x 1until.sh
+ declare -i sum=0
+ declare -i i=1
+ [[ 1 -gt 10 ]]
+ let sum+=i
+ let i++
+ '[' 2 -eq 5 ']'
+ echo 1
1
+ [[ 2 -gt 10 ]]
+ let sum+=i
+ let i++
+ '[' 3 -eq 5 ']'
+ echo 3
3
+ [[ 3 -gt 10 ]]
+ let sum+=i
+ let i++
+ '[' 4 -eq 5 ']'
+ echo 6
6
+ [[ 4 -gt 10 ]]
+ let sum+=i
+ let i++
+ '[' 5 -eq 5 ']'
+ break
[root@iZ28qzns9m4Z bashtest]#
while CONDITION; do
......
if CONDITION2; then
continue

fi
......
done



死循环:
while true; do
循环体
if CONDTION; then
break
fi
done

until false; do
循环体
if CONDITION; then
break
fi
done



while循环的特殊用法:
遍历文件的每一行:
while read VARIABLE; do
循环体
done < /PATH/FROM/SOME_FILE



for循环的特殊用法:
for ((expr1;expr2;expr3)); do
循环体
done

expr1: 定义控制变量,并初始赋值;
expr2: 循环控制条件;
进入条件:控制条件为“真”
退出条件:控制条件为“假”
expr3: 修正控制变量


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: