是什么:
shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核
脚本格式
脚本以#!/bin/bash开头(指定解析器)
一个输出hello,word的脚本 1.sh
#!/bin/bash
echo hello,word
执行脚本
bash 1.sh ---方法1
sh 1.sh ----方法2
source 1.sh ----方法3
./1.sh ----方法4,需要给权限,chmod 777 1.sh
多命令行例子:需求在指定目录~/shellDemo下创建一个nihao.txt,在nihao.txt中增加’nihaoma?’
新建一个.sh文件
在文件中写下指令
#!/bin/bash
cd /home/first/
touch banzhang.txt
echo " I love yq" >> banzhang.txt
运行该脚本
bash batch.sh
测试查看
Home/first文件下多了banzhang.txt 这个文件。显示内容也是对的
shell中的变量
系统变量
- 定义变量:变量=值
- 撤销变量: unset变量
- 声明静态变量: readonly 变量,不能unset
- 提升为全局变量:export 变量
变量定义规则
- 可以由字母、数字和下划线组成,不能以数字开头,环境变量名建议大写
- 等号两侧不能有空格
- 在bash中,变量默认类型是字符串类型,无法直接进行数值运算
- 变量的值如果有空格,需要用双引号或者单引号
- 可把变量提升为全局环境变量,使用export 变量名
特殊变量:
$n:n为数字,$n表示该脚本名称,$1-$9表示第一到第九个参数,10以上的参数要用大括号括起来
此处参数表示执行脚本时的参数
Eg:
#!bin/bash
echo "$0$1$2"
$#:获取所有输入参数个数
Eg:
#!bin/bash
echo "$0$1$2"
echo $#
$*: 代表命令行中所有的参数,把所有参数看成一个整体
$@:代表命令行中所有的参数,把每个参数区分对待
结果:
$?:最后一次执行的命令的返回状态,如果该变量的值为0,说明上一次正确执行了,如果返回非0的数字说明没有正确执行。
运算符
- ((运算式))或者[运算式]
- expr +,-,*,/, % 加,减,乘,除,取余
- expr运算符间要有空格
eg:
也可以这样:
条件判断
[ condition ] condition前后要有空格,条件非空即为true
整数比较
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
Eg:
[ 23 -lt 80 ]
echo $?
文件权限判断
-r 读
-w 写
-x 执行
Eg:
[ -w 1.sh ]
echo $?
文件类型判断
-f 文件存在且是一个常规文件
-e 文件存在
-d 文件存在且是一个目录
Eg:
[ -e 2.sh ]
echo $?
流程控制(重点)
if语句
if [ condition ];then
fi
或者
if[condition ]
Then
Fi
- 注意:
- [ condition ] 中括号和条件判断式之间必须有空格
- if后面要有空格
例子:新建if.sh
运行脚本:
case语句
语法:case $变量名 in "值 1") ;; "值 2") ;; *) esac
注意:
- case行尾必须为单词in ,每一个模式匹配必须以右括号结尾
- 双分号;;表示命令序列结束,相当于java中的break
- 最后的*)表示默认模式,相当于java中的default
Eg:输入1,2,和其他数字分别输出不同的结果
1.新建case.sh文件
2.输入测试
for循环
语法:for ((初始值;循环控制条件;变量变化 )) do done
语法2:for 变量 in 值1 值2 值3 ... do 程序 done
eg:从1加到100
1.新建for.sh脚本
2.测试
Eg:2
1.新建for2.sh
2.测试
while 循环
语法:for ((初始值;循环控制条件;变量变化 )) do done
Eg:从1加到100
1.新建脚本while.sh。内容如下
2.测试结果
read读取控制台输入
基本语法:
read(选项)(参数)
- 选项:
- -p: 指定读取值时的提示符
- -t:指定读取值时等待的事件(秒
- 参数
- 变量:指定读取值的变量名
测试
Eg:提示10秒内,读取控制台输入的名称
1.新建read.sh脚本
2.测试
函数
系统函数
basename语法:basename [string/ pathname][suffix]
- 命令会删除所有的后缀包括最后一个/字符的然后输出字符串
- 选项:suffix 为后缀,可以把后缀给去了
- 用来获取文件名
Eg:
dirname语法:
- dirname 文件绝对路径, 从给定的包含绝对路径的文件名中去除文件名,然后返回剩下的路径
语法:
[ function ] funname[()]{ Action; [return int;]}funname
- 调用函数地方之间要先声明函数
- 函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将最后一条命令运行结果做为返回值
Eg:
自定义函数
语法:[ function ] funname[()]{ Action; [return int;]}funname
- 调用函数地方之间要先声明函数
- 函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将最后一条命令运行结果做为返回值
Eg:
1.新建sum.sh脚本
2.测试
Shell工具
Cut
在文件中剪切数据用,从文件中的每一行剪切字节、字符和字段并将这些字节、字符和字段输出
基本用法: cut[选项参数] filename
- 默认分隔符是制表符
- 选项参数
- -f 列号: 提取第几列
- -d 分隔符,按照指定分隔符分割
例子:
切割系统PATH路径第二个“ :”后所有的路径
Sed
一种流编辑器,一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,sed命令处理缓冲区中的内容,处理完成后,把内容送往屏幕,接着处理下一行,不断重复。文件内容不改变,除非你使用重定向存储输出。
基本用法: sed [选项参数] `command` filename
- 参数说明:
- -e 直接在指令列模式尚进行sed的动作编辑
- 命令功能
- a 新增
- d 删除
- s查找并替换
例子:
增加
将“mei nv”这个单词插入到sed.txt第二行下,打印。
1.新建sed.txt文件,并添加内容
2.输入指令
3.并没有改变源文件
删除
同样没有改变源文件
替换
没有改变源文件
替换加删除
Awk
强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
基本用法: awk [选项参数] 'pattern1{action1}' filename
- pattern:表示awk再数据中查找的内容
- action:找到匹配内容时执行命令
- 选项参数
- -F:指定输入文件分隔符
- -v 赋值一个用户定义变量
Sort
文件排序
基本用法: sort(选项)(参数)
- 选项
- -n 按照数值大小排序
- -r 以相反的顺序排序
- -t 设置排序使用的分隔字符
- -k 指定需要排序的列
- 参数
- 指定待排序文件列表