Until循环
unti 循环和 while 循环恰好相反,当判断条件不成立时才进行循环,一旦判断条件成立,就终止循环。
until 的使用场景很少,一般使用 while 即可。
Shell until 循环的用法如下:
until 条件
do
命令
done
输出数字1-50
[root@centos1 mulu]# vim boke1.sh
#!/bin/bash
i=1
until [ $i -eq 51 ]
do
echo $i
let i++
done
[root@centos1 mulu]# source boke1.sh
1
2
3
4
5
……省略……
45
46
47
48
49
50
输出1-50之和
[root@centos1 mulu]# vim boke2.sh
#!/bin/bash
i=1
he=0
until [ $i -eq 51 ]
do
he=`expr $he + $i`
let i++
done
echo "1-50的总和为:" $he
[root@centos1 mulu]# source boke2.sh
1-50的总和为: 1275
给用户在线用户发送消息,不在线的用户2秒连接一次
if真好理解……
[root@centos1 mulu]# vim boke3.sh
#!/bin/bash
read -p "请输入你要联系的用户名:" a
if grep $a /etc/passwd >/dev/null
then
echo "当前用户在系统中,正在测试是否在线"
if who | grep $a > /dev/null
then
read -p "该用户在线,输入消息:" b
echo $b | write $a
echo "消息:$b 发送成功"
else
echo "该用户不在线"
until who | grep $a > /dev/null
do
sleep 2
echo "正在尝试联系该用户"
done
read -p "该用户已上线,输入消息:" b
echo $b | write $a
echo "消息发送成功"
fi
else
echo "没有该用户"
fi
运行该脚本
对方登录后查看
Shell函数
shell一个非常重要的特性是它可作为一种编程语言来使用。因为shell是一个解释器,所以它不能对为它编写的程序进行编译,而是在每次从磁盘加载这些程序时对它们进行解释。而程序的加载和解释都是非常耗时的。 针对此问题,许多shell(如BourneAgainShell)都包含shell函数,shell把这些函数放在内存中,这样每次需要执行它们时就不必再从磁盘读入。shell还以一种内部格式来存放这些函数,这样就不必耗费大量的时间来解释它们。
函数的优点
1、可以将命令序列按格式写在一起
2、方便重复使用命令序列
shell函数格式
[fanction] 函数名(){
命令序列
[return]
}
其中,return返回的是状态码,需要使用$?调取
echo 返回的是值,使用变量调用
传参:指位置变量
可以带function 函数名() 定义,也可以直接函数名() 定义,不带任何参数。
参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
调用函数
函数名 [参数一] [参数二]
示例:
两数加法计算
[root@1centos hanshu]# vim hanshu.sh#!/bin/bash
function qiuhe {
read -p "请输入第一个数字:" a
read -p "请输入第二个数字:" b
c=`expr $a + $b`
echo "两数之和为:" $c
}
echo `qiuhe` #qiuhe 这个函数定义就是你所定义的命令
[root@1centos hanshu]# source hanshu.sh
请输入第一个数字:1
请输入第二个数字:2
两数之和为: 3
将函数加到自定义函数
复制刚刚写的函数,编辑到 ~/.bashrc
[root@1centos ~]# vim ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
#下面是我复制的函数
function qiuhe {
read -p "请输入第一个数字:" a
read -p "请输入第二个数字:" b
c=`expr $a + $b`
echo "两数之和为:" $c
}
#接着启动这个 ~/.bashrc
[root@1centos ~]# source ~/.bashrc
#刚刚定义的函数就可以直接当命令使用了
[root@1centos ~]# qiuhe
请输入第一个数字:5
请输入第二个数字:5
两数之和为: 10
[root@1centos ~]#
注:一旦定义成local,那变量仅在函数内有效
显示出目录里的子菜单和文件
递归遍历目录
先创建个目录,并在里面赛一点文件
[root@1centos /]# mkdir -p /shiyan/shiyan1/shiyan2
[root@1centos /]# touch /shiyan/1.txt
[root@1centos /]# touch /shiyan/shiyan1/ss1.txt
[root@1centos /]# touch /shiyan/shiya
开始写脚本
[root@1centos hanshu]# vim jiaoben.sh
#!/bin/bash
function dgmu(){
for f in `ls $1`
do
if [ -d "$1/$f" ]
then
echo "$2/$f"
dgmu "$1/$f" " $2"
else
echo "$2$f"
fi
done
}
read -p "请输入你要查看的目录:" a
dgmu $a " "
进行验证
[root@1centos hanshu]# source /hanshu/jiaoben.sh
请输入你要查看的目录:/shiyan
1.txt
/shiyan1
/shiyan2
ss2.txt
ss1.txt
[root@1centos hanshu]#