两种验证表达式
分测试表达式和条件表达式
表达式: 要使shell脚本程序具备一定的"逻辑能力",面临的第一个问题就是:区分不同的情况以确定执行何种操作,解决这个问题用的是:测试语句
测试语句
shell环境根据命令执行后的返回值($ ?)来判断是否执行成功,当返回值为0,表示成功,值为其他时,表示失败.使用专门的测试工具–test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立.
测试语句两种形式: 1 :test条件表达式 2: [条件表达式] 格式注意: 两种方法的作用完全一样,后者为常用.但后者需要注意方括号[ ]与条件表达式之间至少有一个空格.test跟[]的意思一样 条件成立,状态返回值为0,条件不成立,状态返回值为1 [ a ] a的两侧注意要空格
test条件表达式实例: test 1 = 1 ====>结果是0成功 用 echo $? 可以查看
[]条件表达式实例: [ 1 = 1 ] ====> 结果为0 成功 如果两侧没有空格会报错如:[ 1=1] 右边没空格报错,解决方式: [ 1=1] ] 在外空格再加一个方括号
条件表达式之逻辑
逻辑表达式: 逻辑表达式一般用于判断多个条件之间的依赖关系
常见的逻辑表达式有: && 和 ||
&& : 命令1 && 命令2 如果命令1执行成功,那么我才执行命令2 如果命令1执行失败, 那么命令2也不执行
示例: [ 1 = 1 ] && echo “条件成立” ==>条件成立
[ 1 = 2 ] && echo “条件成立” ==> #
|| 命令1 || 命令2 : 如果命令1执行成功,那么命令2不执行, 如果命令1执行失败,那么命令2执行
示例: [ 1 = 2 ] || echo “条件不成立” ===>条件不成立
[ 1 = 1 ] || echo “条件不成立” ===> #
条件表达式之文件表达式
判断输入内容是否是一个文件 -f
示例:
[ -f weizhi.sh ] && echo “是一个文件” ===> 是一个文件
[ -f weizhi.sddh ] || echo “不是一个文件” ===> 不是一个文件
判断输入内容是否是一个目录 -d
判断输入内容是否可执行 -x
条件表达式之数字+字符串
数字操作符: 主要根据给定的两个值,判断第一个与第二个数的关系,如是否大于.小于.等于第二个数.常见选项如下:(n1 一个值 n2一个值 )
n1 -eq n2 相等
n1 -gt n2 大于
n1 -lt n2 小于
n1 -ne n2 不等于
字符串比较:
str1 == str2 str1和str2字符串内容一致
str1 != str2 str1和str2字符串内容不一致,!表示相反的意思.
工作中一般是比较两个变量的内容 : [ “ a " = = " {a}" == " a"=="{b}”] && echo “相等”
两种计算表达式
计算表达式,简单来说就是对具体的内容进行算数计算
格式: 方式一: ( ( 计 算 表 达 式 ) ) : 工 作 当 中 常 用 的 方 式 演 示 : 格 式 a = ((计算表达式)) :工作当中常用的方式 演示: 格式 a= ((计算表达式)):工作当中常用的方式演示:格式a=((变量名a+1)) # echo $((100/5)) ==>20. 注意: 表达式范围内,空格不限制
格式二: let let计算表达式 注意: $(()) 中只能用±*/和()运算符,并且只能做整数运算
演示: 格式:let 变量名a=变量名a+1 注意:表达式必须是一个整体,中间不能出现空格等特殊字符:i=1
let i=i+7
echo $i
linux常见符号
Linux常见的场景符号
重定向符号 管道符 其他符号
重定向符号
在shell脚本中有两种常见的重定向符号 > 和 >>
> :作用表示将符号左侧的内容,以覆盖的方式输入到右侧文件中
演示: 使用重定像符号给文件中增加内容 # cat file.txt ==> nihao # echo “file.txt” > file.txt \# cat file.txt ==>file.txt
>> :表示将符号左侧的内容,以追加的方式输入到右侧文件的末尾行中
管道符 |
| :这个就是管道符,传递信息使用的
使用格式: 命令1 | 命令2 管道符左侧命令1 执行后的结果,传递给管道符右侧的命令2 使用
演示: 查看当前系统中的全局变量SHELLenv | grep SHELL ==> SHELL=/bin/bash
其他符号
后台展示符号 &
定义: & 就是将一个命令从前台转到后台执行 使用格式: 命令 &
命令演示:sleep 4 ==> 界面卡住4秒后消失,4秒内不能做其他操作
sleep 10 & : 表示休眠10秒,但是休眠时界面还可以做其他的操作,只是把进程放入后台隐藏执行了,不影响当前前端的页面,这就是加了&的效果.
常见符号之信息符号+设备文件
全部信息符号 2>&1
符号详解:
1 表示正确输出的信息
2 表示错误输出的信息
2>&1 代表所有输出的信息
演示: 标准正确输出演示: cat nihao.txt 1>> zhengque
错误输出演示: dsdfsfssfsf 2>> errfile
2>&1 演示: bash ceshi.sh >> ceshi-all 2>&1 将所有信息放入ceshi-all文件中
linux系统垃圾桶
/dev/null 是linux下的一个设备文件,这个文件类似于一个垃圾桶,特点是:容量无限大.
常见命令详解
经常使用的linux命令: grep sed awk find
命令格式: grep [参数] [关键字] <文件名> 注意: 我们在查看某个文件的内容的时候,是需要有<文件名> grep命令在结合|(管道符)使用的情况下,后面的<文件名>是没有的 可以通过 grep --help 查看grep的帮助信息
参数详解: -c: 只输出匹配行的计数 -n: 显示匹配行及行号 -v: 显示不包含匹配文本的所有行
-c : 输出匹配到的aaa的个数: 示例: grep -c aaa(要匹配的字符串) find.txt ===> 1
-n : 输出匹配内容,同时显示行号: 示例: grep -n ccc find.txt ===> 4:nihao ccc
-v:匹配到的内容不输出,输出不匹配的内容
精确定位错误代码 : grep -nr [错误关键字] * : 实例: grep -nr nihao * ==> nihao是要查找的字符串 * 代表查找位置当前的文件 -nr n表示行数
sed命令详解
sed是一个行文件编辑工具,因为它编辑文件是以行为单位的
命令格式: sed [参数] ‘<匹配条件> [动作]’ [文件名] 注意: 可以通过 sed --help查看grep的帮助信息
参数详解:
参数为空,表示sed的操作效果,实际上不对文件进行编辑
-i 表示对文件进行编辑 注意: mac版本的bash中使用 -i参数,必须在后面单独加个东西: -i ’ ’
匹配条件:
匹配条件分为两种:数字行号或者关键字匹配
关键字匹配格式:
’ /关键字/ ’ 注意: 隔离符号 / 可以更换成 @ # !等符号 根据情况使用,如果关键字和分隔符号有冲突,就更换成其他的符号即可.
动作详解:
-a 在匹配到的内容下一行增加内容
-i 在匹配到的内容上一行增加内容
-d 删除匹配到的内容
-s 替换匹配到的内容 注意: 上面的动作应该在参数为-i的时候使用,不然的话不会有效果.
替换命令演示关于替换,从三个方面学习: 行号 列号 全体
命令格式: sed -i [替换格式] [文件名] 注意: 替换命令的写法 ’ s### ’ -->’ s#元内容## ’ —>’ s#原内容#替换后内容 ’
演示: 模板文件内容 ==> # cat sed.txt => 文件的内容是:nihao sed sed sed 换行 nihao sed sed sed 换行 nihao sed sed sed
替换第一行首个匹配内容: sed -i '1s#原内容#替换后内容# ’ 文件名 : 1s表示第一行 如果只有一个s表示所有行 ,替换后内容#后是写列号,如果没写就是默认第一列
sed -i ‘s#sed#SED#2’ 文件名: 将所有行的第二个替换,如果有一行开头有大写SED ,那就就从小写那个位置开始数
sed -i ‘3s#sed#SED#2’ 文件名: 将指定的位置的进行替换 3行第2列
sed -i ‘3s#sed#SED#g’ 文件名: 把第三行所有的替换
sed -i ‘s#sed#SED#g’ 文件名: 把所有行所有列都替换
sed增加
增加操作: 作用:在指定行号的下一行增加内容
格式: sed -i ‘行号a\增加的内容’ 文件名 注意: 如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如: sed -i ‘1,3a\增加内容’ 文件名
示例:sed -i ‘2a\zengjia-2’ sed.txt : 在第二行下面增加一行内容为 zengjia-2
sed -i ‘1,3a\tongshi-2’ sed.txt : 1,3a 表示在1行下面 3行下面 增加 内容
指定行的上一行增加:
格式: sed -i ‘行号i\增加的内容’ 文件名 注意:如果增加多行,可以在行号位置写个范围值,彼此间使用逗号隔开,例如: sed -i ‘1,3a\增加内容’ 文件名
sed删除
指定行号删除
格式:sed -i ‘行号d’ 文件名 注意: 如果删除多行,可以在行号位置多写几个行号,彼此间使用逗号隔开,例如: sed -i ‘1,3d’ 文件名
示例: sed -i ‘4d’ sed.txt 删除第4行内容
sed -i ‘1,2’ sed.txt 删除第一行和第二行的内容
常用命令-awk
awk是一个功能强大的文档编辑工具,它不仅能以行为单位还能以列为单位处理文件
命令格式: awk [参数] '[动作] ’ [文件名]
常见参数: -F 指定行的分隔符
常见动作: print 显示内容 $0 显示当前行所有内容 n 显 示 当 前 行 的 第 n 列 内 容 , 如 果 存 在 多 个 n 显示当前行的第n列内容,如果存在多个 n显示当前行的第n列内容,如果存在多个n,它们之间使用逗号(,)隔开
常见内置变量:
FILENAME 当前输入文件的文件名,该变量是只读的
NR 指定显示行的行号
NF 输出 最后一列的内容
OFS 输出格式的列分隔符,缺省是空格
FS 输入文件的列分隔符,缺省是连续的空格和Tab
示例: awk ‘{print $1}’ awk.txt ==打印第一列内容
awk ‘{print $0}’ awk.txt 打印所有列的内容
awk ‘{print $1,$2}’ awk.txt 打印第一列 第三列的内容
awk’{print NR,$1,$3}’ awk == 打印第一列 第三列的内容并显示行号
awk 'NR1 {print $1,$3}’ awk.txt打印第一行第1和第3列内容 NR 表示行号为1列的默认分割符是空格,如果把空格替换成了其他符号如:,就是一列了
awk -F ‘:’ ‘{print $2,$4}’ awk.txt ==表示文档中的:为分隔符 就会识别其为列的分隔符
设置显示分隔符,显示内容 实例: awk ‘BEGIN{OFS="-"} {print NR,$0}’ awk.txt ==>1-awk-awk
2-awk-awk 默认分割符就是符号 -,这就等于是对一个变量进行重新赋值了.
常用命令-find
命令格式: find [路径] [参数] [关键字]
参数详解:
-name 按照文件名查找文件
-perm 按照文件权限来查找文件
-user 按照文件属主来查找文件
-group 按照文件所属的组来查找文件
-type 查找某一类型的文件 如: b-块设备文件 d-目录 c-字符设备文件 p-管道文件 l-符号链接文件 f-普通文件
-size n:[c] 查找文件长度为n块的问价n,带有c时表示文件长度以字节计
-depath: 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找
-mindepath n: 在查找文件时,查找当前目录中的第n层目录的文件,然后再在其子目录中查找
! :表示取反