RHCE第五周(shell脚本)
一:shell脚本的基础
1:执行脚本的4种方式
1)相对路径执行
就是./脚本的路径,就是要在脚本的当前路径下执行
缺点:一但不在脚本的目录下的话,就执行不了,需要可执行权限
2)绝对路径执行
/脚本的路径,需要可执行权限
3)bash 执行
bash 脚本路径,不需要可执行权限
前面三种都是在子shell中执行的,如果定义了变量,在当前shell中执行不了
4)source 执行
source 脚本路径,不需要可执行权限,在当前shell中执行
2:规范性
1)尽量第一行写用什么shell #! /bin/bash
2)注释,写描述信息
3)代码尽量有层次性
4)shell脚本中尽量以.sh结尾。但实际上后缀不影响
5)避免过多的代码,能一次写完就不要写多次,少用cat命令
3:位置变量
1:常用的
| ${1-9} | 代表着输入1到9个参数 |
| ${10} | 10以上的要用大括号 |
| $0 | 打印出自己的文件名 |
| $$ | 输出执行脚本的pid |
| $@ | 代表着所有的参数 |
| $* | 代表着所有的参数(双引号的,区别) |
| $? | 代表着返回上一次命令的正确与否 |
| $# | 代表着输入参数的总个数 |
2:案例
1)$@和$?的区别
带上双引号的话
$@:就是每个参数都是一个个体
$*:就代表着输入的参数都是一个整体
$@ [root@server opt]# cat test.sh #!/bin/bash touch "$@" [root@server opt]# [root@server opt]# bash test.sh 1 2 3 [root@server opt]# ls 1 2 3 test.sh $* [root@server opt]# cat test.sh #!/bin/bash touch "$*" [root@server opt]# bash test.sh 1 2 3 [root@server opt]# ls 1 '1 2 3' 2 3 test.sh
2)$0和$#
[root@server opt]# cat test.sh #!/bin/bash touch $1 touch $2 echo "文件输入的参数总共为:$#" echo "文件的名字叫:$0" [root@server opt]# [root@server opt]# bash test.sh 1 2 文件输入的参数总共为:2 文件的名字叫:test.sh
4:read命令
变量的输入,就是我不知道要添加参数,可以使用read命令来提示用户要输入参数
1:常用的选项
| -p | 提示信息 |
| -s | 暗文输入 |
| -t | 超时时间 |
2:案例
1)创建用户的脚本文件
[root@server opt]# cat test.sh #!/bin/bash read -p "input your username:" user_name useradd $user_name read -s -p "input your password:" user_word echo "$user_word" | passwd --stdin $user_name &> /dev/null echo echo "$user_name is created" #脚本执行 [root@server opt]# source test.sh input your username:qqq input your password: qqq is created
二:shell中的符号
1:逻辑符号
&&:逻辑与,就是前面的命令正确的执行了,后面的命令才能执行,
|| :逻辑或,就是前面的命令正确的执行了,后面的命令就不能执行,只有一个能执行,另外一个不能执行
!:逻辑非,就是将真变成假的,假的变成真的
2:条件测试符号
1:test 条件表达式,在命令行中手动的测试
2:[ ] 2边都要有空格,可以使用 -a,-o,!这些
3:[ [ ] ] 2边都要有空格。可以使用逻辑与,逻辑或,逻辑非这些,支持正则表达式和通配符
3:逻辑运算符
| -a | 逻辑与 | [ 命令1 -a 命令2 ] |
| -o | 逻辑或 | [ 命令1 -o 命令2 ] |
| ! | 逻辑非 | [ ! 命令1 ] |
4:数值运算符
| -eq | 2边相等,为真返回0 |
| -ne | 2边不相等,为真返回0 |
| -gt | 大于 |
| -ge | 大于等于 |
| -lt | 小于 |
| -le | 小于等于 |
5:文件测试运算符
| -f | 检查是否为文件,真,返回为0 |
| -d | 检查是否为目录,真,返回为0 |
| -e | 检查目录(文件)是否存在,真,返回为0 |
| -s | 检查文件是否为空,不为空,返回为0 |
| -w | 检查文件是否有写的权限 |
| -b | 检查设备是否为块设备 |
6:字符串运算符
就是做字符串比较的
| == | 检查2个字符串是否相等,一个=也行 |
| != | 检查2个字符串不相等 |
| -z | 检查字符串的长度是否为0,真则返回为0,可以用来判断是否输入了参数 |
| -n | 检查字符串的长度不为0,真,则返回0 |
| str | 检查字符串是否为空 |
字符串比较的话,尽量带上双引号,比如-n这个选项,就要带上,不带上,就没有用了
总结:就是[ ]和 [[ ]]这个里面做的数值运算的话,就要使用le,lt什么的
()和(())用的数值运算就是数学中的符号
7:退出码
exit 10
三:shell中的运算
1:$(())运算
+-*/,
[root@server opt]# a=100 [root@server opt]# b=20 [root@server opt]# echo $(($a+$b)) 120 [root@server opt]# echo $(($a-$b)) 80 [root@server opt]# echo $(($a*$b)) 2000 [root@server opt]# echo $(($a/$b)) 5 [root@server opt]#
2:$[ ]运算
[root@server opt]# a=100 [root@server opt]# b=20 [root@server opt]# echo $[$a+$b] 120 [root@server opt]# echo $[$a-$b] 80 [root@server opt]# echo $[$a*$b] 2000 [root@server opt]# echo $[$a/$b] 5
四:shell中的语句
1:if语句
1:格式
1)单支
if 判断;then
执行代码
fi
2)多支
if 判断;then
执行代码
elif 判断;then
执行代码
else
执行代码
fi
用来判断的,为真,就执行代码,为假,就跳过,判断下一个
2:case语句
1:格式
case 变量名 in
值1)
执行代码;;
值2)
执行代码;;
*)
执行代码;;
esac
跟if一样,判断的,条件为真,就执行,if能执行的,case也能执行
3:for语句
1:格式
for i in 列表
do
执行代码
done
2:列表的写法
直接列出值,用文件扩展符,使用命令的结果
for i in 1 2 3 4 5
do
echo $i
done
echo --------------------
for j in {1..5}
do
echo $j
done
echo ------------
for y in `seq 5`
do
echo $y
done
都能达到目的
以空格来读的,就是遇到空格就执行代码
4:while语句
1:格式
while 条件判断
do
执行代码
done
echo 执行代码
条件为真,就一直执行
2:用来读取不同的文件的方式
exec < /opt/user.txt ; while read line
do
echo $line
done
echo ---------------
while read line
do
echo $line
done < /opt/user.txt
echo --------------
cat /opt/user.txt | while read line
do
echo $line
done
可以通过标准输入,来输入给变量,以行来读取文件的,遇到空格就分割
3:死循环
就是一直保持着运行
就是可以作为监控磁盘的占用率,监控服务是否启动了等操作
while systemctl is-active httpd
do
echo sucess
sleep 5
done
5:until循环
1:格式
until 条件判断
do
执行代码
done
条件为假,就一直执行代码
7:break和continue退出循环
break:退出整个循环
continue:退出当前循环,执行下一次循环
1)遇到5不能退出循环
for i in `seq 7`
do
if [ $i -eq 5 ];then
break
fi
echo $i
done
echo --------
for i in `seq 7`
do
if [ $i -eq 5 ];then
continue
fi
echo $i
done
输出的结果
[root@server opt]# bash for2.sh
1
2
3
4
--------
1
2
3
4
6
7
总结:
熟悉的掌握各个符号,然后语句的使用要非常的熟练

浙公网安备 33010602011771号