for 变量 in 列表
do
代码
代码
....
done
循环的逻辑:
- 将列表中的每个元素逐一赋值给变量
- 每赋值一次,do和done之间的代码就会执行一次
方法1:直接给出列表元素【用空格分隔多个元素】
方法2:用通配符来生成元素
方法3:用命令来生成元素
方法4:用{ }展开的形式生成元素
案例1:生成数字列表
#!/bin/bash
for num in {1..10}
do
echo $num
sleep 1
# 每次执行完睡眠1秒
done
案例2:检查172.16.100.1-10在线主机
#!/bin/bash
clear
echo "===============程序开始执行==================="
for num in {1..10}
do
ip="172.16.100.$num"
if ping -W1 -c1 $ip &>/dev/null;then
echo "$ip is online"
else
echo "$ip is offline"
fi
sleep 0.5
done
echo "===============程序执行完毕==================="
案例3:生成字符串列表
#!/bin/bash
for xxx in {a..f}
do
touch /tmp/$xxx.txt
done
案例4:判断/etc下每个文件的文件类型
#!/bin/bash
# 方法一
for fileName in `ls /etc/`
do
if [ -f $fileName ];then
echo "$fileName 是一般文件"
elif [ -d $fileName ];then
echo "$fileName 是目录文件"
else
echo "$fileName 是其他类型文件"
fi
sleep 0.5
done
#!/bin/bash
# 方法二:
for fileName in /etc/*
do
if [ -f $fileName ];then
echo "$fileName 是一般文件"
elif [ -d $fileName ];then
echo "$fileName 是目录文件"
else
echo "$fileName 是其他类型文件"
fi
sleep 0.5
done
格式1:正常循环的格式
while 条件
do
代码
代码
done
格式2:读取文件格式
while read line
do
代码
代码
done
案例1:输出/etc/passwd 中每行有多少个字符,要求显示结果是 第x行,有x个字符
#!/bin/bash
m=1
while read line
do
nums=`echo $line | wc -c`
echo "第$m 行有$nums 个字符"
m=$[$m+1]
done
案例2:输出每个用户的用户名和shell类型
#!/bin/bash
while read line
do
name=`echo $line | awk -F ":" '{print $1)'`
stype=`echo $line | awk -F ":" '{print $NF}'`
echo "用户 $name 的shell类型是$stype";
done
案例3:输出1-100之间的数字
#!/bin/bash
num=1
while [ $num -le 100 ]
do
echo $num
num=$[$num+1]
done
案例4:每隔5s检查一次jerry是否登录系统
#!/bin/bash
while true
do
sleep 5
if who | grep "^jerry\>" &>/dev/null;then
echo "jerry is online"
exit 3
else
echo "jack is offline"
fi
done
break:终止循环-直接跳出循环
continue:立刻终止
案例1:每隔5s检查一次jerry是否登录系统
#!/bin/bash
while true
do
sleep 5
if who | grep "^jreey\>" &>/dev/null;then
echo "jack is online"
break
else
echo "jreey is offline"
continue
fi
done
案例2:99乘法表
#!/bin/bash
for num in {1..9}
do
for num2 in {1..9}
do
echo -n "$num2*$num=$[$num*$num2]";
echo -n " ";
if [ $num -eq $num2 ];then
break;
fi
done
echo
done
函数就是一段代码
通过使用函数可以实现代码的复用,降低代码的冗余度,提高开发效率
定义函数的格式
函数名()
{
代码
代码
}
注意:函数无法直接使用,必须在调用的时候,才能运行
调用的函数的格式
函数名
案例:
#!/bin/bash
fun1()
{
echo "函数开始了";
echo "111";
echo "函数结束了";
}
echo "start"
fun1
echo "stop"
fun1
/etc/init.d/functions
加载/引入函数库
source
.
linux中服务管理脚本的路径
/etc/rc.d/init.d
首先创建一个函数库文件:/tmp/funlab
# my hahahahaha
show_user()
{
echo "`whoami`"
}
show_host()
{
echo "`hostname`"
}
然后在shell脚本中调用函数库中的函数
#!/bin/bash
. /tmp/funlab
echo "start"
show_user
echo "stop"
show_host
show_user
show_host
show_host
函数的输出结果
- 在函数中通过执行echo,向外输出内容
函数的返回结果
- 用return XXX进行返回【return的值必须是数值类型】
- 返回结果默认是不会显示出来的
- 通常来说,在程序中,需要用一个变量来接收函数的返回结果
分析结果
#!/bin/bash
fun2(){
echo "aaaaa"
exit 4
echo "bbbbb"
return 3
echo "cccc"
echo "dddd"
}
echo "1111"
fun2
n=$?
echo "2222"
echo $n
=======================执行结果=====================
1111
aaaa
#!/bin/bash
fun2(){
echo "aaaaa"
return 4
echo "bbbbb"
exit 3
echo "cccc"
echo "dddd"
}
echo "1111"
fun2
n=$?
echo "2222"
echo $n
=======================执行结果=====================
1111
aaaa
2222
4
环境变量:Linux内置的变量
自定义变量:用户自己定义的变量
位置变量:用于向脚本/函数传递参数
一般环境变量都是大写的
- set
- env
PATH: 定义搜索命令的路径
USER: 当前用户的用户名
HOME: 当前用户的家目录
PS1: 当前用户的提示符
PS2: 当前用户的续航符
SHELL: 当前用户的shell类型
UID: 当前用户的uid
环境变量配置文件
- 用户环境变量配置文件
- 在用户家目录下,.bashrc .bash_profile
- 系统环境变量配置文件
- /etc下,bashrc和profile
修改环境变量
临时:
案例:修改PATH变量,将tmp添加到path变量中共 export PATH=$PATH:/tmp/
永久:
修改环境变量配置文件 vim /etc/bashrc 最后添加一行 export PATH=$PATH:/home 让当前会话生效 source /etc/bashrc
位置变量,也称之为位置参数
作用是用于向函数或者向脚本传递参数的接收变量的位置变量是:$0 $1 $2 $3 $$ $#
$# 参数的个数
$0 脚本名称
$1... 第几个参数
$$表示当前脚本的进程ID
案例:
#!/bin/bash
if [ $# -ne 3 ];then
echo "error.参数错误"
echo "Usage:$0 姓名 年龄 性别"
exit 3
fi
echo "程序开始执行....";
echo "姓名是:$1"
echo "年龄是:$2"
echo "性别是:$3"
echo "脚本名称是:$0"
echo "脚本参数个数是:$#"
[root@localhost tmp]# ./6.sh tom 18 male
程序开始执行....
姓名是:tom
年龄是: 18
性别是:male
脚本名称是:./6.sh
脚本参数个数:3
案例:通过函数,判断两个数字的大小,输出较大的数字
#!/bin/bash
read -p "请输入数值1:" num1
read -p "请输入数值2:" num2
fun1()
{
m=$1
n=$2
if [ $m -ge $n ];then
echo "$m"
else
echo "$n"
fi
}
fun1 $num1 $num2