顺序执行
从上到下逐条执行命令,执行完所有命令及退出。
选择执行
(1)&&,||
&&:代表and,&&左侧为真右侧则执行
||:代表or,||左侧为假右侧则执
(2)if语句
代码有一个分支;条件满足时才会执行;两个或以上的分支;只会执行其中一个满足条件的分支;
单分支的if语句
if 测试条件;then
代码分支
fi
双分支的if语句:
if 测试条件;then
条件为真时执行的分支
else
条件为假时执行的分支
fi
示例:通过参数传递一个用户名给脚本,此用户不存在,则添加之
#!/bin/bash
#
#
[ $# -eq 0 ] && echo "enter username" && exit 1
if id $1 &> /dev/null;then
echo "the is username exists"
exit 2
else
useradd $1 && echo "useradd finish"
fi
多分支的if语句
if condition1;then
条件1为真分支;
elif condition2;then
条件2为真分支
elif condition3;then
条件3为真分支
…
elif conditionN;then
条件n为真分支
else
所有条件均不满足时的分组
fi
注意:即便多个条件可能同时都能满足,分支只会执行其中一个,首先测试为“真”的那个;
示例:脚本参数传递一个文件路径给脚本,判断此文件的类型;
#!/bin/bash
#
#
if [ $# -lt 1 ];then
echo "enter one filepath"
exit 1
fi
if [ -L $1 ];then
echo "symbolic link"
elif
[ -d $1 ];then
echo "Directory"
elif
[ -b $1 ];then
echo "block device file"
elif
[ -c $1 ];then
echo "character special file"
elif
[ -f $1 ];then
echo "Common file"
elif
[ -p $1 ];then
echo "pipe"
elif
[ -S $1 ];then
echo "Socket file"
else
echo "Alien"
fi
注意:-L判断软连接需要写在判断首行,直接在命令行键入 file /var/* 就可以查看文件类型,file命令本身就是查看文件类型的
(3)case语句
case varname in
pattern1)
suite1
;;
pattern2)
suite2
;;
…
patternn)
suitenn
;
*)
other_suiten
;;
esac
;;双分号结尾,单分号表示结束,case是一直比较。可单独成行或者在最后一行命令最后
case中各pattern可以使用模式
a|b:a或b
*:匹配任意长度的任意字符
?:匹配任意单个字符
[-]:范围匹配
[a-z])
[0-9])
示例;让用户输入一个选项,根据其选项给出对应的信息
#!/bin/bash
#
#
cat <
cpu) display cpu information
mem) display memory iniformation
disk) dispaly disks iniformetion
quit) quit
================================
EOF
read -p "enter your option:" option
while [ $option != "cpu" -a $option != "mem" -a $option != "disk" -a $option != "quit" ];do
echo "enter cpu mem disk quit"
read -p "enter your option again:" option
done
case $option in
cpu)
lscpu ;;
mem)
free -m ;;
disk)
fdisk -l /dev/[hs]d[a-z] ;;
*)
echo "quit"
exit 1 ;;
esac
循环执行
将一段代码重复执行0,1,多次;
进入条件:只有在条件满足时才进入循环
退出条件:每个循环都应该有退出条件,以有机会退出循环;
for循环
两种格式:
(1)遍历列表
(2)控制变量
for循环格式
==================================
for 变量名字 in list; do
循环体
done
==================================
遍历列表:
进入条件:只要列表有可用元素,即可进入循环;
退出条件;列表中的原素遍历完成
list的生成方式
(1)直接给出
#!/bin/bash
#
#
for username in user22 user23 user24 ;do
useradd $username
done
(2)整数列表
#!/bin/bash
#
#
for filename in 1 2 3 4 5;do
touch $filename
done
(a){start..end}
#!/bin/bash
#
#
declare -i sum=0
for i in {1..100};do
let sum=sum+i
done
echo "$sum"
(b)seq[start [incremtal]]last
#!/bin/bash
#
#
for filename in `seq 10`;do
touch $filename
done
(3)返回列表的命令
(4)glob
(5)变量引用
#!/bin/bash
#
#
#
username=`cut -d: -f1 /etc/passwd`
for userid in $username;do
id $userid
done
#!/bin/bash
#
#
declare -i sum=0
id=`cut -d: -f3 /etc/passwd`
for uid in $id;do
let sum=sum+uid
done
echo $sum
while循环
进入条件:condition测试为"真"
退出条件:condition测试为"假"
while循环格式
=========================================
while condition;do
循环体
循环控制变量修正表达式
done
=========================================
示例
#!/bin/bash
#
#
declare -i i=0
declare -i sum=0
while [ $i -le 100 ];do
let sum=sum+i
let i++
done
echo $sum
until循环
进入条件:condition测试为"假"
退出条件:condition测试为"真"
until循环格式
=============================================
until condition;do
循环体
循环控制变量修正表达式
done
=============================================
示例
#!/bin/bash
#
#
declare -i i=0
declare -i sum=0
until [ $i -gt 100 ];do
let sum=sum+i
let i++
done
echo $sum
break:提前跳出循环
while condition1;do
cmd1
…
if condition1;then
break
fi
cmdn
…
done
示例
#!/bin/bash
#
#
declare -i i=0
declare -i sum=0
while [ $i -le 100 ];do
let sum=sum+i
let i++
if [ $i -eq 50 ];then
break
fi
done
echo $sum
continue:提前结束本轮循环,而直接进入下一轮循环判断;
while condition1;do
cmd1
…
if condition1;then
continue
fi
cmdn
…
done
#!/bin/bash
#
#
declare -i i=0
declare -i sum=0
while [ $i -le 100 ];do
let sum=sum+i
let i++
if [ $i -eq 50 ];then
continue
fi
sum1=$[sum+i]
done
echo $sum
echo $sum1
特殊执行顺序
创建死循环:
============================================================
while true;do
循环体
done
退出方式;
某个测试条件满足时,让循环体执行break命令
============================================================
示例
#!/bin/bash
#
#
while true;do
ifwho |grep '^hacker\>' &> /dev/null ;then
break
fi
done
echo "hacker is up"
echo out now |write 'hacker'
sleep:命令
sleep – delay for a specified amount of time
延迟指令时间
sleep NUMBER[SUFFIX]…
while循环的特殊用法(遍历文件的行)
====================================================================================
while read variable;do
循环体
done < /path/from/sumfile
依次读取/path/from/somfile文件中的每一行,且将其赋值给variable变量;
====================================================================================
示例:找出id号为偶数的用户,显示其用户名,ID和默认shell
#!/bin/bash
#
#
while read line;do
username=`echo $line |cut -d: -f1`
userid=`echo $line |cut -d: -f3`
usershell=`echo $line |cut -d: -f7`
if [ $[$userid%2] -eq 0 ];then
echo "${username} ${userid} ${usershell}"
fi
done
for循环的特殊用法
==========================================================================================
for((控制变量初始化;条件判断表达式;控制变量的修正语句));;do
循环体
done
控制变量初始化;仅在循环代码开始运行时执行一次;
控制变量的修正语句;每轮循环结束后会先进行控制变量修正运算,而后再做条件判断;
==========================================================================================
示例;打印九九乘法表(逆序)
#!/bin/bash
#
#
for ((i=1;i<=9;i++));do
for ((j=i;j<=9;j++));do
echo -n "$i*$j=$[i*j]"
done
echo
done
打印九九乘法表(顺序)
#!/bin/bash
#
#
for ((i=1;i<=9;i++));do
for ((j=1;j<=i;j++));do
echo -n "$j*$i=$[i*j]"
done
echo
done
完
原创文章,作者:M20-1马星,如若转载,请注明出处:http://www.178linux.com/38331