linux学习之shell的流程控制
linux学习之shell的流程控制
ⅰ、shell之选择执行语句
1、 用法:if CONDITION;then
if-true-分支
fi
//CONDITION是if的判断语句,如果判断的结果为真,则执行if-true-分支;
//如果判断的结果为假,则不执行
例:
if CONDITION;then
if-true-分支
else
if-false-分支
fi
//CONDITION的判断结果为真,则执行if-true-分支语句;
//如果判断的结果为假,则执行if-false-分支语句;
2、位置参数变量
/bin/bash bashname.sh file1 file2
//bashname.sh的位置参数为$0
//file1的位置参数为$1
//以此类推......
//file10超过10个位置参数的引用就需要${10}
特殊变量
$?:命令执行的结果;
$#:传递个脚本或函数的参数个数;
$*和[email protected]:引用传递个脚本或函数的参数列表
轮替:shift [n]
3、与用户交互
使用read命令与用户交互;
方法:
read [Options] chera
[Options]
-p "PROMPI" //提示信息
-t timeout //超时时间
例:
4、命令引用
用法: `COMMAND`,$(COMMAND)
例子:
echo `date`
echo $(date)
练习:写一个脚本,判断给定的两个数值大小,给定的数值使用脚本参数以及用户交互
#!/bin/bash
#这个脚本是通过用户交互的模式获得两个参数,然后比较大小
read -p "请输入两个数:" -t 10 n1 n2
if [ $n1 -ge $n2 ];then
echo "Max num: $n1, Min num: $n2"
else
echo "Max num: $n2, Min num: $n1"
fi
ⅱ、循环语句:
循环式将循环体执行0或多次:
需要循环必须满足进入条件
如要推出必须满足推出条件
使用for while 以及until都可以完成循环语句的控制
1、for语句
用法
for VARIABLE in LIST;do
循环体
done
LIST:是有一个或多个空格分割的字符串组成,把列表的每个字符串逐个赋值给VARIABLE表示的变量
例:
for username in usera userb userc used;do
useradd $username
echo "Add $username finished"
done
//此循环的进入条件是list不为空
//推出条件是list遍历结束,即添加完userc用户
练习:请添加10个用户
#!/bin/bash
#添加10个用户
for username in user1 user2 user3 user4 user5 user6 user7 user8 user9 user10;do
useradd $username
echo "Add $username finished"
done
2、LIST的生成方法:
1)、整数列表:
a)、{start..end}//生成指定开始和结束段的整数表
b)、$(seq [start [step]] end)//生成指定开始并以step(一个步进值)步进到结束值的数值表
例:
2)、直接给出列表
3)、glob
例:
4)、命令生成
例:
[[email protected] ~]# bash a.sh
root primary group: root
bin primary group: bin
daemon primary group: daemon
adm primary group: adm
lp primary group: lp
sync primary group: root
shutdown primary group: root
halt primary group: root
mail primary group: mail
uucp primary group: uucp
operator primary group: root
games primary group: users
gopher primary group: gopher
ftp primary group: ftp
nobody primary group: nobody
dbus primary group: dbus
usbmuxd primary group: usbmuxd
vcsa primary group: vcsa
rpc primary group: rpc
rtkit primary group: rtkit
avahi-autoipd primary group: avahi-autoipd
abrt primary group: abrt
rpcuser primary group: rpcuser
nfsnobody primary group: nfsnobody
haldaemon primary group: haldaemon
gdm primary group: gdm
ntp primary group: ntp
saslauth primary group: saslauth
postfix primary group: postfix
apache primary group: apache
pulse primary group: pulse
webalizer primary group: webalizer
tomcat primary group: tomcat
sshd primary group: sshd
tcpdump primary group: tcpdump
usera primary group: usera
userb primary group: userb
userc primary group: userc
hadoop primary group: hadoop
usertest primary group: usertest
testuser1 primary group: testuser1
named primary group: named
user1 primary group: user1
user2 primary group: user2
user3 primary group: user3
user4 primary group: user4
user5 primary group: user5
user6 primary group: user6
user7 primary group: user7
user8 primary group: user8
user9 primary group: user9
user10 primary group: user10
[[email protected] ~]#
3、算术运算符
+ - * / % **(次方)
数值的几种运算方式
(1) $[$A+$B]
(2) $(($A+$B))
(3) let VARIABLE=$A+$B
(4) VARIABLE=$(expr $A + $B)
例:求100以内的所有正整数的和
#!/bin/bash
#求100以内正整数的和
let sum=0
for i in {1..100};do
sum=$[$sum+$i]
done
echo "100以内正整数的和是:$sum"
4、增强型赋值
即表示变量通过加减1或者乘除自己的值来改变
+= -+ *= /= 等
如 let num++ 表示在num这边变量的数值上加1,然后将运算后得到的数值在赋个num
let num++ 等效 let num=$[$num+1]
例:
#!/bin/bash
#显示etc目录下所有普通文件的列表,然后统计个数
declare -i count=0
for file in /etc/*; do
if [ -f $file ]; then
let count++
echo "$count $file"
fi
done
echo "Total: $count files."
5、测试表达式
整数测试
字符串测试
注意:
(1) 字符串等会比较测试:[ "$hostname" == 'localhost' ]
(2) 模式匹配测试:[[ "STRING" =~ PATTERN ]]
//表示左侧的字符串能否被右侧的模式匹配 必须使用在双中括号中且前后有空格
(3) 与的优先级高于或的优先级
组合测试条件:
条件间逻辑运算:
与:多个条件要同时满足;
或:多个条件满足其一即可;
非:对指定的条件取反;
表达式组合:
与:` CONDITION1 -a CONDITION2 `
或:` CONDITION1 -o CONDITION2 `
非:[ ! CONDITION ]
命令组合:
与:COMMAND1 && COMMAND2 <-- [ EXPR1 ] && [ EXPR2 ]
或:COMMAND1 || COMMAND2
非:! COMMAND
短路操作符:&&
false && true = false
false && false = false
true && false = true
true && true = true
if COMMAND1; then
COMMAND2
fi
//满足COMMAND1执行COMMAND2
短路操作符:||
rue || true = true
true || false = true
false || true = true
false || false = false
if ! COMMAND1; then
COMMAND2
fi
//满足COMMAND1执行COMMAND2
COMMAND1 && COMMAND2 || COMMAND3
//表示满足COMMAND1就执行COMMAND2 否则执行COMMAND3
6、多分支if语句
单分支:
if CONDITION; then
if-true-分支
fi
双分支:
if CONDITION; then
if-true-分支
else
if-false-分支
fi
多分支:
if CONDITION1; then
if-CONDITION1-true-分支
elif CONDTION2; then
if-CONDITIO2-true-分支
...
else
if-ALL-false-分支
fi
此处写一个if多分支的例子
7、case语句
case语句属于多分支语句
用法:
case $VARIABLE in
PATTERN1)
分支1
;;
PATTERN2)
分支2
;;
PATTERN3)
分支3
;;
...
PATTERNn)
分支n
;;
esac
//变量满足那个PATTERN就执行相应的分支
PATTERN可使用glob模式的通配符:
*: 任意长度的任意字符;
?: 任意单个字符;
[]: 指定范围内的任意单个字符;
a|b: 多选1;
8、while循环
用法
while CONDITION;do
循环体
done
该循环需要先判断是否符合进入循环体的条件;不满足则不能进入或者退出循环
示例:求100以内所有正整数之和;
#!/bin/bash
#
declare -i sum=0
declare -i i=1
while [ $i -le 100 ]; do
let sum+=$i
let i++
one
echo "Sum: $sum."
9、until循环
用法
until CONDITION; do
循环体
循环控制变量的修正表达式
done
次处的进入进入和退出条件就跟while的完全相反了, CONDITION为假时进入循环,为真则不能进入或者退出循环
示例:求100以内所有正整数之和
#!/bin/bash
#
declare -i sum=0
declare -i i=1
until [ $i -gt 100 ]; do
let sum+=$i
let i++
done
echo "Sum: $sum."
10、循环控制
在while等语句中会用到continue和break两个来控制循环
如需提前结束本轮循环,直接进入下一轮循环使用continue
如需提前结束循环,则使用break
11、死循环
表示一直能满足循环的条件,将会一直执行循环体
while true; do
循环体
if CONDTION; then
break
fi
done
until false; do
循环体
if CONDITION; then
break
fi
done
12、while循环的特殊用法:
遍历文件的每一行:
while read VARIABLE; do
循环体
done < /PATH/FROM/SOME_FILE
事例
13、使用for循环打印99乘法表
ⅲ、函数
函数就是实现某种功能的方法,调用函数就是调用方法,
函数必须先定义后调用
定义方法:
(1)
function f_name {
函数体
}
(2)
f_name() {
函数体
}
调用函数:
f_name [argu1, argu2, ...]
自定义函数状态返回值:
return [#]
0: 成功
1-255:失败
注意:函数代码执行时,一旦遇到return,函数代码终止运行,函数返回;
通过函数的方式有助于提升编程效率,实现模块化编程
转载于:https://blog.51cto.com/pizimsn/1698001