1.shell脚本的创建和执行
1.1 创建
[root@localhost ~]# mkdir shell
[root@localhost ~]# cd shell
[root@localhost shell]# vi 1.sh
1.2 执行
1)第1种:
[root@localhost shell]# sh 1.sh
2)第2种:
首先赋予权限
[root@localhost shell]# chmod +x 1.sh
执行脚本
[root@localhost shell]# ./1.sh
2.常用命令
2.1 查看脚本执行过程
[root@localhost shell]# bash -x 1.sh
2.2 查看脚本是否有语法错误
[root@localhost shell]# bash -n 1.sh
2.3 data命令
1)显示年月日
[root@localhost shell]# date +%Y-%m-%d
[root@localhost shell]# date +%F
[root@localhost shell]# date +%y-%m-%d
2)显示时间
[root@localhost shell]# date +%H:%M:%S
[root@localhost shell]# date +%T
3)显示一年中的第几周
[root@localhost shell]# date +%W
4)显示一周中的第几天
[root@localhost shell]# date +%w
3.shell脚本中的变量
3.1 变量和变量的格式
1)在shell脚本中使用变量会使我们的脚本更加专业,更像一门语言,所以我们编写脚本时,就可以使用变量来代替某个使用频繁并且长度很长的字符串
2)定义变量的格式为:“变量名=变量的值”
在脚本中引用变量时需要加上符号$
(两种方法)
3)数学运算要用[ ]括起来并在前面加符号$
3.2 和用户交互
3.3 shell脚本预设变量
在上例当中,$1、$2、$3从何而来呢?
这其实就是shell脚本的预设变量
在执行时输入1、2、3
$1就是脚本的第一个参数,$2就是脚本的第二个参数,以此类推,shell脚本的预设变量是没有限制的($0代表脚本本身的名字)
4.shell脚本中的逻辑判断
4.1 不带else
#!/bin/bash
read -p "请输入一个数字" a
if ((a<60))
then
echo "不及格"
fi
[root@localhost shell]# ./1.sh
4.2 带有else
#!/bin/bash
read -p "请输入一个数字" a
if ((a<60))
then
echo "不及格"
else
echo "及格"
fi
[root@localhost shell]# ./1.sh
4.3 带有elif
#!/bin/bash
read -p "请输入一个数字" a
if ((a<60))
then
echo "不及格"
elif ((a>=60)) && ((a<70));
then
echo "良好"
elif ((a>=70)) && ((a<80));
then
echo "优秀"
else
echo "超棒"
fi
[root@localhost shell]# ./1.sh
4.4 嵌套
4.5 注意事项
在上述例子中可以看到我们使用的是(( )),除了使用(( ))还可以使用[ ],但是不能使用>、<、=这样的符号了要使用-lt(小于)-gt(大于)
-eq(等于)-ne(不等于),下面我们来做个表直观地感受一下
使用符号 | 小于 | 大于 | 等于 |
(( )) | > | < | = |
[ ] | -lt | -gt | -eq |
4.6 if逻辑判断
if判断文件的目录属性
(判断是普通文件还是目录,是否有读、写、执行权限等)
常用选项:
-e:判断文件或目录是否存在
-d:判断是不是目录以及是否存在
-f:判断是不是普通文件以及是否存在
-r:判断是否有读权限
-w:判断是否有写权限
-x:判断是否可执行
4.7 shell中的case判断
在shell脚本中除了用if来判断逻辑外,还有一种常用方式——case
5.shell中的循环
5.1 for循环
1)基本结构
for 变量名 in 循环的条件;
do
command
done
3)循环的条件可以是一组字符串或者数字(用一个或者多个空格隔开),也可以是一条命令的执行结果,还可以引用系统命令的执行结果(但必须用反引号括起来)
2)举例
(脚本中的seq 1 5表示1到5的一个序列)
执行结果
1)基本结构
while 条件;
do
comand
done
常常用while循环来编写死循环的脚本,用于监控某项服务
2)举例1
执行结果
另外,可以用一个冒号来代替循环条件,这样可以做到死循环
6.shell中的中断与继续
在shell脚本循环的过程中,我们难免会遇到一些特殊需求,比如当循环到某个地方时需要做一些事情,这时候很可能需要退出循环,或者跳过本次循环,这样的需求如何实现呢?
6.1 跳出循环break
1)break用在循环中,不管是for或者while都可以,在脚本中使用它,表示退出该层循环。之所以说层,是因为有时我们会用到嵌套循环,大循环里面还有小循环,而break仅仅是退出那一层循环,它的上层循环不受影响。
2)举例
[root@localhost ~]# vi break.sh
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if (( $i==3 ))
then
break
fi
echo $i
done
echo aaaaaa
执行结果
可以看到当i=3时,会跳出循环,后面的4和5都不会再执行了
[root@localhost ~]# ./break.sh
6.2 结束本次循环continue
1)continue也是使用在循环中的,但和break不同的是,当在shell脚本中遇到continue时,结束的不是整个循环,而是本次循环
2)举例
[root@localhost ~]# vi break.sh
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if (( $i==3 ))
then
continue
fi
echo $i
done
echo aaaaaa
[root@localhost ~]# ./break.sh
6.3 退出整个脚本exit
1)exit它的作用范围更大,就是直接退出整个shell脚本
2)举例
[root@localhost ~]# vi break.sh
#!/bin/bash
for i in `seq 1 5`
do
echo $i
if (( $i==3 ))
then
exit
fi
echo $i
done
echo aaaaaa
执行结果
[root@localhost ~]# ./break.sh
7.shell中的函数
7.1 什么是shell脚本中的函数
1)shell脚本中的函数就是先把一段代码整理到一个小单元中,并给这个小单元命名,当用到这段代码时直接调用到这个小单元的名字即可
2)有时候脚本中的某段代码总是重复使用,如果写成函数,每次用到时直接用函数名代替即可,这样不仅节省时间还节省空间
3)注意:在shell脚本中,函数一定要写到最前面,不能出现在中间或者最后。因为函数是要被调用的,如果还没有出现就被调用,肯定会出错
7.2 基本结构+各种例子
1)基本结构
function f_name()
{
command
}
2)举例
#!/bin/bash
function sum()
{
sum=$[$1+$2]
echo $sum
}
sum 1 2
执行结果
[root@localhost shell]# sh func.sh 1 2
3)打印出第一个参数、第二个参数、参数的个数及脚本
#!/bin/bash
input()
{
echo $1 $2 $# $0
#输出函数的第一个、第二个的参数:$1 $2
#输出参数的个数:$#
#输出脚本名:$0
}
input 1 a b
执行结果
[root@localhost shell]# ./1.sh
4)获得一个网卡的ip地址
#!/bin/bash
ip()
{
ifconfig |grep -A1 "$1: " |tail -1 |awk '{print $2}'
}
read -p "Please input the eth name: " e
myip=`ip $e`
echo "$e address is $myip"
ip addr //查看网卡
//如果遇到这种情况需要安装一下net-tools
yum install -y net-tools
执行结果
[root@localhost shell]# ./2.sh
首先定义一个数组
[root@localhost shell]# a=(1 2 3 4 5)
1)命令 echo ${a[@]} 读取数组中的全部元素
[root@localhost shell]# echo ${a[@]}
2)命令 echo ${#a[@]} 获取数组的元素个数
[root@localhost shell]# echo ${#a[@]}
3)命令 echo ${a[2]} 读取第三个元素(数组从0开始)
[root@localhost shell]# echo ${a[2]}
1)a[1]=100; echo ${a[@]} 替换指定的元素值
[root@localhost shell]# a[1]=100; echo ${a[@]}
2)a[5]=2; echo ${a[@]} 如果下标不存在则会自动添加一个元素
[root@localhost shell]# a[5]=2; echo ${a[@]}
3)a[7]=6; echo ${a[@]} 跳着添加元素时,中间未赋值的元素
不显示且无值
[root@localhost shell]# a[7]=6; echo ${a[@]}
1)命令unset a[1] 用于删除单个元素
[root@localhost shell]# unset a[1]
2)命令unset a 用于删除整个数组
[root@localhost shell]# unset a
在进行实验操作之前,需要对一个数组进行赋值 a=(`seq 1 5`)
[root@localhost shell]# a=(`seq 1 5`)
1)命令echo ${a[@]:0:3} 表示从第一个元素开始,截取3个元素,并打印出来
[root@localhost shell]# echo ${a[@]:0:3}
2)命令 echo ${a[@]:0-3:2} 表示从倒数第3个元素开始,截取2个元素,并打印出来
[root@localhost shell]# echo ${a[@]:0-3:2}
1)命令echo ${a[@]/1/100} 表示用100替换1,但不会保存替换,只是打印出来
[root@localhost shell]# echo ${a[@]/1/100}
2)命令a=(${a[@]/1/100}) 表示用100替换1,这种方法不仅可以打印出来还可以保存替换
[root@localhost shell]# a=(${a[@]/1/100})