【Linux】Shell脚本详解
创始人
2024-03-19 20:56:27
0

目录

  • 一.概述
  • 二.Linux提供的Shell解析器
  • 三.Shell入门
    • 1.执行一个简单的shell脚本
    • 2.脚本常用的执行方法
  • 四.变量
    • 1.系统预定义变量
    • 2.自定义变量
    • 3.特殊变量
  • 五.运算符
  • 六.条件判断
    • 1.单条件判断
    • 2.多条件判断
  • 七.流程控制(重点)
    • 1.if判断
    • 2.case语句
    • 3.for循环
    • 4.while循环
  • 八.read读取控制台输入
  • 九.函数
    • 1.系统函数
  • 十.正则表达式
  • 十一.文本处理工具
  • 十二.实际案例

一.概述

Shell是一个命令行解释器,它接收应用程序或者用户的命令,然后调用操作系统内核。
我们把很多命令放在一个文件,让Shell去执行,这个文件就叫脚本文件。

在这里插入图片描述


二.Linux提供的Shell解析器

# cat /etc/shells   //查看解析器类型
# echo $SHELL       //查看解析器,CentOS默认是/bin/bash

在这里插入图片描述

三.Shell入门

#!/bin/bash 开头  //指定解析器

1.执行一个简单的shell脚本

①建一个hello.sh文件(# touch hello.sh)。
②打开hello.sh文件(# vim hello.sh),并写入 #!/bin/bashecho"hello,world"
③执行hello.sh文件

2.脚本常用的执行方法

第一种:采用 bash 或 sh 加 脚本的相对路径或绝对路径(不用赋予脚本 +x 权限)sh+脚本的相对路径
# sh ./hello.shsh+脚本的绝对路径
# sh /root/shells/hello.shbash+脚本的相对路径
# bash ./hello.shbash+脚本的绝对路径
# bash /root/shells/hello.sh第二种:输入脚本的绝对路径或相对路径执行脚本(必须赋予脚本 +x 权限)
# chmod +x shells/hello.sh   //先赋予脚本可执行权限(x)相对路径
# ./hello.sh绝对路径
# /root/shells/hello.sh

四.变量

1.系统预定义变量

常用系统变量
$HOME、$PWD、$SHELL、$USER等。查看系统变量
# echo $SHELL显示所有变量
# set显示系统全局变量
# env

2.自定义变量

基本语法
(1)定义变量:变量名=变量值。注意: =号前后不能有空格
(2)撤销变量:unset 变量名
(3)声明只读变量:# readonly 变量名=变量值。注意:不能 unset
(4)# export 变量名 //由局部变量变为全局变量变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)在bash中,默认都是字符串类型,无所进行运算。
(3)变量的值如果包含空格,需要用双引号或单引号包含起来。 

示例:

[root@liu100 ~]# my_test="hello world"   //自定义变量
[root@liu100 ~]# echo $my_test           //打印自定义变量
hello world
[root@liu100 ~]# readonly a=9            //自定义可读变量
[root@liu100 ~]# a=99                    //修改可读变量(不可修改)
-bash: a: 只读变量
[root@liu100 ~]# unset my_test           //撤销自定义变量
[root@liu100 ~]# echo $my_test           //打印已经撤销的变量,已经没有了[root@liu100 ~]# unset a			     //撤销自定义可读变量(不可撤销)
-bash: unset: a: 无法反设定: 只读 variable

3.特殊变量

$n     //n的取值为 $0 表示脚本名称,$1-$9 代表一到九个参数,大于10,需要 ${10}这种形式。

hello.sh 脚本内容
在这里插入图片描述

hello1hello2 是我们输入的两个参数值
在这里插入图片描述

$#  //获取我们当前输入参数的个数

在这里插入图片描述

在这里插入图片描述

$*  //获取命令行所有的参数,把所有参数看做一个整体
$@  //获取命令行所有的参数,把每个参数区分开来,相当于把参数放在一个集合中

在这里插入图片描述

在这里插入图片描述

$?  //最后一次执行命令的返回状态。返回值是0代表上一个命令执行正确,否则上一个命令执行错误

在这里插入图片描述

五.运算符

$((运算式))或$[运算式]  //对数字进行运算

在这里插入图片描述

六.条件判断

1.单条件判断

注意:条件表达式不是空即为 true,否则为 false,使用 $? 判断返回的是啥,0对应true,1对应false

# test 条件表达式   //条件判断
[ 条件表达式 ]      //条件判断,前后都有空格

(1) 整数比较

注意字符串比较使用 = 判断相等,!= 判断不相等

常用判断条件作用
-eq等于(equal)
-ne不等于(not equal)
-lt小于(less than)
-le小于等于(less equal)
-gt大于(greater than)
-ge大于等于(greater equal)

(2) 按照文件权限比较

常用判断条件作用
-r读的权限
-w写的权限
-x执行的权限

(3) 按照文件类型比较

常用判断条件作用
-e文件存在(exittence)
-f文件存在并且是一个文件(file)
-d文件存在并且是一个目录(directory)
[root@liu100 ~]# [ 1 = 2 ]              //1=2吗 false
[root@liu100 ~]# echo $?
1
[root@liu100 ~]# [ 1 = 1 ]              //1=1吗 true
[root@liu100 ~]# echo $?
0
[root@liu100 ~]# [ 1 -gt 2 ]            //1>2吗 false
[root@liu100 ~]# echo $?
1
[root@liu100 ~]# [ -x hello.sh ]        //hello.sh有执行权限吗 false
[root@liu100 ~]# echo $?
1
[root@liu100 ~]# [ -f /home/jjr ]       // /home/jjr存在并且是文件吗 false
[root@liu100 ~]# echo $?
1
[root@liu100 ~]# [ -d /home/jjr ]       // /home/jjr存在并且是目录吗 true
[root@liu100 ~]# echo $?
0

2.多条件判断

多条件判断 && 表示前一条命令执行成功,才会执行,|| 表示前一天命令执行失败才会执行和java里面的三元运算符类似。

在这里插入图片描述

七.流程控制(重点)

1.if判断

基本语法(1) 单分支if  [ 条件判断式 ]; then程序
fi或者if  [ 条件判断式 ]
then程序
fi(2) 多分支if  [ 条件判断式 ]
then程序
elif [ 条件判断式 ]
then程序
else程序
fi注意事项(1)  if 后面有空格, [ 条件判断式 ] 中括号里面前后也有空格。(2)  -a 相当于java里面的and,-o 相当于java里面的or。

多个条件判断式
在这里插入图片描述

脚本文件内容
在这里插入图片描述

执行脚本文件的结果
在这里插入图片描述

2.case语句

基本语法case $变量值 in
"值1")变量值等于值1,执行程序1
;;
"值2")变量值等于值2,执行程序2
;;...其他分支*)不匹配上面的所有值,执行这个程序
;;
esac注意事项(1)  ;; 相当于java里面的 break(2)  *) 相当于java里面的 default

脚本文件内容
在这里插入图片描述

执行脚本文件的结果
在这里插入图片描述

3.for循环

基本语法for ((初始值;循环控制条件;变量变化))
do程序
done或者for 变量 in 值1 值2 值3...
do程序
done相当于java加强for循环

脚本内容 1-100 累加(普通for循环)
在这里插入图片描述
脚本执行结果
在这里插入图片描述
脚本内容 1-100 累加(加强for循环),执行结果和上图一样
在这里插入图片描述

4.while循环

基本语法while [ 条件判断式 ]
do程序
done

脚本内容 1-100 的累加
在这里插入图片描述
在这里插入图片描述


八.read读取控制台输入

基本语法read [选项][参数]
选项:-p:指定读取时的提示符-t:指定读取值时等待的时间(秒) 如果不加-t表示一直等待
参数:变量:指定读取值得变量名

脚本内容

在这里插入图片描述

执行脚本结果
在这里插入图片描述

九.函数

1.系统函数

  • basename
基本语法basename [string/pathname] [后缀名]  //删除所有前缀,包括最后一个 / 字符(取路径里面的文件名称),如果加上后缀,他会把文件名里的后缀去掉

在这里插入图片描述

  • dirname
基本语法dirname 文件绝对路径  //从绝对路径中去除非目录的部分,然后返回目录的部分

在这里插入图片描述

  • 自定义函数
基本语法function(可省略)  函数名()    //()也可省略
{程序;return int; //可省略,通过 $? 获取返回值
}

脚本内容
在这里插入图片描述
执行结果
在这里插入图片描述

十.正则表达式

常用特殊字符^  //匹配一行的开头例如:# cat /etc/passwd | grep ^a    //匹配a开头的行$  //匹配一行的结束例如:# cat /etc/passwd | grep b$    //匹配b结束的行.  //匹配一个任意字符例如:# cat /etc/passwd | grep c..d  //匹配开头是c结尾是d的四个字符长度的所有行*  //表示匹配前一个字符0次或者多次例如:# cat /etc/passwd | grep e*f  //匹配e开头f结尾的不限长度的行[]        //匹配某个范围的字符[6,8]     //匹配6和8[5-8]    	//匹配5到8[0-9]*    //匹配任意长度的数字字符串[a-z]     //匹配a-z之间的字符[0-5,7-9] //匹配0-5或7-9之间的任意数字例如:# cat /etc/passwd | grep g[a,b,c]h  //匹配g开头h结尾之间必须是a或b或c的行\ //表示转义  \* 代表 *符号

十一.文本处理工具

  • cut
注意:默认分隔符是制表符
# cut [可选参数] 文件内容  //文件中负责剪切数据
# cut -f 1,2 -d " "       //第一列和第二列按照 " "进行分割
参数作用
-f列号,提取第几列
-d分隔符,默认是制表符
-c按照字符进行分割,后面加n,表示取第几列 比如:-c 2
  • awk
# awk [可选参数] '/pattern1/{action1} /pattern2/{action2}' 文件内容
参数作用
-F指定文件分隔符
-v赋值一个用户自定义变量

十二.实际案例

归档文件
需求:实现每天对指定目录归档备份的脚本,输入一个目录名称(末尾不带/),将目录下所有文件按天归档保存,并将日期附件在归档文件名上,放在 /home/jjr 目录下。
脚本内容:#!/bin/bash
#判断输入的参数是一个if [ $# -ne 1 ]
thenecho "仅能输入一个参数"exit
fi#获取参数中的目录if [ -d $1 ]
thenecho
elseecho "目录不存在"exit
fi#获取你输入的路径的最后一个文件名或目录
file_name=$(basename $1)
#获取你输入路径的全路径
path_name=$(cd $(dirname $1);pwd)#获取当前日期
DATE=$(date +%y%m%s)#定义归档文件名称
file=ikun_${file_name}_$DATE.tar.gz
DIR=/home/jjr/$file#归档echo "开始归档"tar -czf $DIR $path_name/$file_nameif [ $? -eq 0 ]
thenecho "归档成功"
elseecho "归档失败"
fiexit

在这里插入图片描述
设置定时任务

# crontab -e //编辑定时任务,保存之后就会执行。     crontab -l 查看定时任务

在这里插入图片描述

相关内容

热门资讯

汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...