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

  

 

总结:

熟悉的掌握各个符号,然后语句的使用要非常的熟练

 

posted @ 2024-01-17 10:14  q_7  阅读(15)  评论(0)    收藏  举报