shell脚本
简单来说就是将所有命令行封装进一个文件中,在赋予该文件可执行权限后,./文件.sh 即可执行该文件中得命令,而不需要将所有命令打出
shell脚本得基本格式
#!/bin/sh
注释 头文件得意思是以什么方式运行,sh即为直接运行解释器,可以换为php等
脚本内容
shell变量
shell中得变量格式 var=数据 注:一定不要多加空格在变量名称附近,否则识别var就不是脚本中得变量了,变量名称得规范只能有英文字母,下划线以及数字,且不能以数字开头
输出 与java中sout类似得关键字为echo 例:echo “123” 如果输出定义得变量时,需要如下格式 :
var=123
echo ${var}
截取字符串
string="superman is handsome"
echo ${string:1:4} # 输出 uper
数组得定义
arr=(数据,其中数据间以,分割)
输出数组:echo ${arr[n]}或者echo ${arr[*]或者echo ${arr[@]}
获取数组得长度:echo KaTeX parse error: Expected '}', got '#' at position 2: {#̲arr[n]}其他写法类似 数…{arr[index]},index即为索引的位置
shell中得注释:
shell中得参数传递
获取输入得参数格式为:$n,n代表执行脚本得第几个参数,$0代表执行得文件名 KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ 代表参数得个数,* 代表传递得参数
shell中得运算符
原生得bash不支持数学运算,需要通过awk或者expr来实现, expr举例:var=
1 + 1
echo v a r 其 中 ‘ 不 是 ′ 区 分 开 算 数 运 算 符 : 条 件 表 达 式 要 放 在 方 括 号 之 间 , 并 且 要 有 空 格 , 例 如 : [ var 其中`不是'区分开 算数运算符:条件表达式要放在方括号之间,并且要有空格,例如: [ var其中‘不是′区分开算数运算符:条件表达式要放在方括号之间,并且要有空格,例如:[a==$b] 是错误的,必须写成 [ $a == $b
] 其中得*前面必须加\才能实现运算 a=1 b=2 关系运算符:
操作符 | 说明 | 举例 |
---|---|---|
-eq | 等于 | [ $a -eq $b ] false |
-gt | 小于 | [ $a -gt $b ] false |
-lt | 等于 | [[ $a -lt $b ] true |
-ge | 大于等于 | [ $a -ge $b ] false |
-le | 小于等于 | [ $a -le $b ] true |
布尔运算符:
操作符 | 说明 | 举例 |
---|---|---|
-a | 与 | [ $a < $b -a $a == $b ] false |
-o | 或 | [ $a < $b -0 $a == $b ] true |
! | 非 | [[ $a != $b ] true |
逻辑运算符:&& || 逻辑与逻辑或 字符串运算符: str1=“123” str2=“123”
操作符 | 说明 | 举例 |
---|---|---|
= | 等于返回true | [ $str1 = $str2 ] true |
!= | 不等于返回true | [ $str1 = $str2 ] false |
-z | 字符串长度为0返回true | [ -z $str1 ] false |
-n | 字符串长度不为0返回true | [ -n “$str2” ] true |
$ | 字符串不为空:true | [ $str2 ] true |
文件测试运算符 fileName="/usr/local/test"
操作符 | 说明 | 举例 |
---|---|---|
-d | 该文件是目录返回true | [ -d $fileName ] |
-f | 文件为普通类型文件返回true | [ -f $fileName ] |
-r | 文件可读返回true | [ -r $fileName ] |
-w | 文件可写返回true | [ -w $fileName ] |
-x | 文件可执行返回true | [ -x $fileName ] |
-s | 文件不为空返回true | [ -s $fileName ] |
-e | 文件包括目录存在返回true | [ -e $fileName ] |
shell中得test命令 与 file中判断以及字符串判断与上述类似
shell中的条件判断 if格式如下
a=1
b=2
if [ $a > $b ]
then
echo "a大于b"
elif[ $a == $b ]
then
echo "a和b相等"
else
then
echo "a小于b"
fi
for循环 格式如下
arr=(1,2,3,4,4)
for v in arr
do
echo $v
done
while循环
a=3
while [ $a != 0 ]
do
echo $a
let "a--"
done
无限循环
1、for(( ; ))
2、while true
do
command
done
3、while :
do
command
done
until循环,将条件循环到为true时结束
a=3
until [ $a == 0 ]
do
echo $a
let "a--"
done
case 类似java中得switch
echo "输入学生成绩:"
read num #读取数字
grade=`expr $num / 10`
case $grade in
10) echo "满分"
;;
9) echo "best"
;;
8) echo "great"
;;
7) echo "better"
;;
6) echo "good"
;;
*) echo "you are a bad guy"
esac
正则表达式
匹配符 | 说明 | 举例 |
---|---|---|
^ | 匹配行首 | grep ^ [a] t.sh匹配以a开头行 |
$ | 匹配行尾 | [grep [末尾]$ t.sh |
* | 模糊匹配 | grep a* t.sh |
[] | 匹配[]内得字符 | grep [b=] t.sh |
\ | 转义字符 | grep [ ^0-9$ ] t.sh匹配0-9和美元符号 |
. | [ -s $fileName ] | |
-e | 匹配任意单字符 | grep [ ^.*$ ] t.sh |
pattern{n} | 匹配模式中出现n次 | |
pattern{n,} | 匹配模式中最少出现n次 | |
[[:upper:]] | [A-Z] | |
[[:lower:]] | [a-z] | |
[[:digit:]] | [0-9] | |
[[:alnum:]] | [0-9a-zA-Z] | |
[[:space:]] | 空格或者tab | |
pattern{n,m} | 匹配模式中最少出现n-m次 | |
[[:alpha:]] | [a-zA-Z] |
[Ss]igna[lL] 匹配单词signal、signaL、Signal、SignaL
^d..x..x..x 用户、用户组及其他用户组成员有可执行权限的目录
^[^l] 排除关联目录的目录列表
[^$] 匹配空行
[^.*$] 匹配行中任意字符串
^.$ 匹配仅有一个字符的行
[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\} 匹配日期格式dd-mm-yyyy
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} 匹配IP地址格式nnn.nnn.nnn.nnn
grep过滤
匹配符 | 说明 | 举例 |
---|---|---|
-c | 输出匹配行得计数 | |
-i | 忽略大小写 | |
-h | 不显示文件名 | |
-I | 查询多文件时只输出包含匹配字符得文件名 | |
-n | 显示匹配行及行号 | |
-v | 显示不好含匹配文本得所有行 |
extended grep egrep
awk文本分析工具 awk操作符
操作符 | 说明 | 举例 |
---|---|---|
= += *= /= %= ^= | 赋值运算符 | |
&& ! | 并 与 非 | |
~ !~ | 匹配 不匹配 | |
< <= == != >= > | 关系运算符 | |
±*/%^ | 算数运算符 |
字符串操作函数
操作符 | 说明 | 举例 |
---|---|---|
= += *= /= %= ^=gsub(r,s) | 在整个$0中用s替代r | cat t.sh | awk 'gsub("123","abc") {print $0}' |
gsub(r,s,t) | 返回s中字符串t的第一位置 | |
index(s,t) | 匹配 不匹配 | |
length(s) | 测试s是否包含匹配r的字符串 | |
split(s,a,fs) | 在fs上将s分成序列a | |
sprint(fmt,exp) | 返回经fmt格式化后的exp | |
sub(r,s) | 用$0中最左边最长的子串代替s | |
substr(s,p) | 返回字符串s中从p开始的后缀部分 | |
substr(s,p,n) | 返回字符串s中从p开始长度为n的后缀部分 |
Sed
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序
操作符 | 说明 | 举例 |
---|---|---|
-n | 在整个$0中用s替代r | sed特殊处理得行特别显示 |
-e | 多项编辑 | |
-f | 将sed动作写在一个文件内 |
sed编辑命令
操作符 | 说明 | 举例 |
---|---|---|
p | 打印当前行 | |
= | 显示文件行号 | |
a\ | 在定位行号后附加新文本信息 | |
i\ | 在定位行号前插入文本信息 | |
d | 输出定位行号 | |
c | 用新文本替换定位文本 | |
r | 从另一个文件中读取文本 | |
w | 写文件到一个文件 | |
q | 第一个模式匹配后推出或者立即推出 | |
l | 显示与八进制ASCII代码等价得控制字符 |
sort命令排序
操作符 | 说明 | 举例 |
---|---|---|
-c | 测试文件是否已经分类 | |
-m | 合并俩个分类文件 | |
-u | 删除所有复制行 | |
-o | 存储sort结果得输出文件名 | |
-b | 使用域进行分类,忽略第一个空格 | |
-n | 指定分类是域上得分类 | |
-t | 域分隔符非空格键和tab分割域 | |
-k | 指定列数 |
cut截取
操作符 | 说明 | 举例 |
---|---|---|
-c list | 指定剪切字符数 | |
-f field | 指定剪切域数 | |
-d | 指定域空格和tab键不同的域分割符 | |
-b | 与-c类似 |