【Linux】Shell脚本
目录
- 一.概述
- 二.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/bash
和 echo"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
脚本内容
hello1
和 hello2
是我们输入的两个参数值
$# //获取我们当前输入参数的个数
$* //获取命令行所有的参数,把所有参数看做一个整体
$@ //获取命令行所有的参数,把每个参数区分开来,相当于把参数放在一个集合中
$? //最后一次执行命令的返回状态。返回值是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 查看定时任务
【Linux】Shell脚本相关推荐
- 学习笔记之Linux Shell脚本教程:30分钟玩转Shell脚本编程
Linux Shell脚本教程:30分钟玩转Shell脚本编程 http://c.biancheng.net/cpp/shell/ 转载于:https://www.cnblogs.com/pegasu ...
- Linux shell脚本基础学习
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...
- linux 检查权限,检查目录下 文件的权限-linux shell脚本,
检查目录下 文件的权限-linux shell脚本, #!/bin/bash #History: #2019/07/23 Fsq #This Program will check Permiss ...
- Linux shell脚本数值计算个人心得
Linux shell脚本数值计算个人心得 本篇博客为,个人对与bash数值计算的一些心得与用法. Bash对于数值是没有明确定义的,在shell里面所有的数值都默认为字符串,并不是单纯的数值. 比如 ...
- linux运维实战练习及linux shell脚本、awk、sed工具命令学习总结
一.linux shell 脚本 1.描述shell程序的运行原理(可附带必要的图形说明): Linux系统的shell作为操纵系统的外壳,为用户提供使用操纵系统的接口.它是命令语言.命令解释程序及程 ...
- linux shell脚本字符串连接符,学习Linux shell脚本中连接字符串的方法
这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...
- linux下实用小脚本,十个增加 Linux Shell 脚本趣味的小工具
很多人误以为shell脚本只能在命令行下使用.其实shell也可以调用一些GUI组件,例如菜单,警告框,进度条等等.你可以控制最终的输出,光标位置还有各种输出效果.下面我将介绍一些工具,帮助你创建强大 ...
- Linux Shell脚本入门--wget 命令用法详解
Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...
- Linux shell脚本基础学习详细介绍(完整版)一
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...
- linux sh脚本 while,Linux shell脚本使用while循环执行ssh的注意事项
原标题:Linux shell脚本使用while循环执行ssh的注意事项 如果要使用ssh批量登录到其它系统上操作时,我们会采用循环的方式去处理,那么这里存在一个巨大坑,你必须要小心了. 一.场景还原 ...
最新文章
- set debug mode for flex builder
- Spring-国际化信息01-基础知识
- 紧致差分的matlab程序,对流占优扩散方程的一种新C—N 紧致差分格式
- 从体验上拉开差距,Serverless 将成就云计算的下一个 10 年!
- 1_3 SingletonMode 单例模式
- Nand Flash与Nor Flash
- RabbitMQ工作模式Publish/Subscribe发布订阅,test测试代码
- POJ NOI MATH-7826 分苹果
- 4.熟悉App Inventor 2编程界面
- ios UIView sizeToFit sizeThatFits
- 利用HttpHandler和Cache统计点击量
- esp8266教程:开发方式和SDK选择
- Linux系统、Ubuntu更换清华软件源
- 腾讯产品经理培训生笔试攻略,笔试题型详细解析(送历年笔试题库)!
- word下载哪一个比较好
- fastadmin中selectpage条件wherein添加
- K8s 污点(Taints)与容忍(Tolerations)
- 163邮箱的格式怎么写,如何申请电子邮箱?
- 浏览器默认主页被360篡改解决办法
- x的y次方python表达式怎么写_x 的 y 次方(xy) 以下表达式正确的是________