文章目录
1.shell脚本调试技巧
#1.Windows下编辑的脚本需要使用dos2unix格式化
dos2unix demo.sh
#2.使用bash命令参数调试
-n:不会执行该脚本,仅查询脚本语法是否有问题,并给出错误提示
-v:在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本,如果有错误,也会给出错误提示
-x:将执行的脚本内容及输出显示到屏幕上,这是对调试很有用的参数
export PS4='+${LINENO}'可以在每一行的前面加上内容的行号
#3.使用set命令进行部分脚本调试
set-n:读命令但并不执行。
set-v:显示读取的所有行。
set-x:显示所有命令及其参数。
1.通过set-x命令开启调试功能,而通过set+x关闭调试功能
2.Shell脚本自动化交互式
1.Here Document
格式
命令 << 分隔串(最为常见的为EOF)
字符串1
…
字符串n
分隔串
举例
root@localhost test]# cat test.sh
#! /bin/bash
read -p "enter number:" no
read -p "enter name:" name
echo you have entered $no, $name
#然后我们利用重定向来完成交互的自动化:
[root@localhost test]# ./test.sh <<EOF
>1
>lp
you have entered 1, lp
3.Shell的前后台
命令 | 含义 |
---|---|
fg( frontground) 前台执行 | Ctrl+z可以挂起前台运行的程序,用fg恢复到前台 |
bg(background) 后台执行 | 在命令后面加上&它会在后台执行,并将特殊的环境变量$!设置为该任务的进程ID |
4.vi命令(编辑模式)
1 | 2 |
---|---|
显示行号 | set nu |
跳转到指定的行 | 行数gg |
删除指定的行 | 行数dd |
删除所有内容 | ggdG |
跳转到文本末尾 | G |
跳转到当前行末尾 | A |
撤销 | u |
恢复上一步被撤销的 | ctrl+u |
从上往下查 | /字符 |
从下往上查 | ?字符 |
4.shell数组
# 数组的定义
array_name=(a b)
# 传递所有的数组值
函数名 ${array_name[@]}
# 查看所有数组的索引
${!array_name[@]}
# 查看
${#array_name[@]}
5.shell数值
# 数值的定义
i=0 #不要有空格
# 数值的计算
let i=i+1
6.字符串的分割
${parameter/parttern/string}
用string来替换第一个匹配的pattern
${parameter//pattern/string}
用string来替换parameter变量中所有匹配的pattern
string="hello,shell,split,test"
array=(${string//,/ })
for var in ${array[@]}
do
echo $var
done
7.sed命令
定义:行文件编辑工具,因为它编辑文件是以行为单位的
语法: sed -参数 '脚本命令' 文件名
参数:
参数名 | 含义 |
---|---|
-n | 取消静默输出 |
-i | 表示对文件进行编辑 |
common.ini
user_name=cs_name
jar = cs_jar
database_pwd = cs_pwd
redis_pwd = cs_pwd_redis
#默认输出common.ini所有的内容
sed 's/cs_pwd/123456/' common.ini
#只输出修改过的行
sed -n 's/cs_pwd/123456/p' common.ini
动作:
以下动作在参数为-i时候才会生效
动作 | 含义 |
---|---|
a | 在匹配到的内容下一行增加内容 |
i | 在匹配到的内容当前行增加内容 |
d | 删除匹配到的内容 |
s | 替换匹配到的内容 |
p | 查看指定内容 |
7.1增
########################在指定的行号附近增加增加内容######################################
sed -i '行号1,行号2a/增加的内容' 文件名 #在指定的行号后面添加数据
sed -i '行号1,行号2i/增加的内容' 文件名 #在指定的行号前面添加数据
sed -i '$a增加内容' 文件名 #在最后一行的下面增加一行内容
sed -i '1i新增行的内容' 文件名 #在第一行上面增加一行内容
########################在匹配内容附近增加增加内容######################################
#在匹配到的内容的上一行增加内容
sed -i '/匹配到的内容/i 增加的内容' 文件名
sed '/jar = cs_jar/i jar =/home/json' common.ini
#在匹配到的内容的下一行增加内容
sed -i '/匹配到的内容/a 增加的内容' 文件名
sed '/jar = cs_jar/a jar =/home/json' common.ini
#在匹配到的内容的当前行增加内容,原有的内容被清空
sed -i '/匹配到的内容/c 增加的内容' 文件名
sed '/jar = cs_jar/c jar =/home/json' common.ini
注意
sed中的行号从1开始
7.2删
########################删除指定行号内容######################################
#删除指定行号的内容,删除指定范围内的行号
sed -i '行号1,行号2d' 文件名
########################删除匹配内容相关内容######################################
#删除匹配到的内容所在的行,匹配多行则删除多行
sed -i '/匹配的内容/d' 文件名
#只删除匹配到内容
sed -i 's/匹配的内容/空内容/' 文件名 #当一个行匹配了多个内容,默认替换第一个内容
sed -i 's/匹配的内容/空内容/g' 文件名 #当一个行匹配了多个内容,替换所有内容
sed
注意
2.多个操作之间用;进行分割,正则如何进行扩展使用,显示行号=
7.3改
########################替换指定行号的内容######################################
#指定行号,列号,默认替换首行内容,g代表替换所有内容
sed -i '行号s/原内容/替换后内容/列号' 文件名
########################替换匹配的内容######################################
#替换匹配的内容
sed -i 's/正则表达式/替换的内容/' 文件名 #替换每行首个匹配内容
sed -i -r 's/扩展正则表达式匹配到的内容/替换的内容' 文件名 #扩展正则 如*+?|
注意
关键字匹配时隔离符号/ 可以更换成@,#,!等符号,根据情况使用,如果关键字和隔离符号有冲突,就更换成其他的符号即可
7.4查
#-n选项会禁止sed,p标记会输出修改过的行,将二者匹配使用的效果就是只输出被替换命令修改过的行
sed -n '/匹配的内容/p' 文件名
8.awk命令
定义: awk是一个功能非常强大的文档编辑工具,它不仅能以行为单位还能以列为单位处理文件
语法:awk -参数 '命令' 文件名
参数:
参数 | 含义 |
---|---|
-F | 指定列的分隔符,在不指名-F域分隔符的情况下,默认的域分隔符是空格 |
-f | 调用脚本 |
-v | 定义变量 |
动作
动作 | 作用 |
---|---|
显示内容 $0:显示当前行所有内容 n : 显 示 当 前 行 的 第 n 列 内 容 , 如 果 存 在 多 个 n:显示当前行的第n列内容,如果存在多个 n:显示当前行的第n列内容,如果存在多个n,它们之间使用逗号(,)隔开 |
BEGIN{ 命令 } #初始代码块,主要和变量相关
/pattern/{ 命令 } #pattern正则匹配、执行代码块
END{ 命令 } #结束代码块,主要和信息输出相关
内置变量:
内置变量 | 含义 |
---|---|
FILENAME | 当前输入文件的文件名,该变量是只读的 |
NR | 指定显示行的行号 |
NF | 输出最后一列的内容 |
OFS | 输出格式的列分隔符,缺省是空格 |
FS | 输入文件的列分融符,缺省是连续的空格和Tab |
举例
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
syslog:x:996:994::/home/syslog:/bin/false
lighthouse:x:1000:1000::/home/lighthouse:/bin/bash
mongod:x:995:990:mongod:/var/lib/mongo:/bin/false
#例1
awk -F ':' '{print $1} /etc/passwd
#例2
awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}' /etc/passwd
#例3:搜索/etc/passwd有root关键字的所有行
awk -F: '/root/' /etc/passwd
awk -F: '/^root/'' /etc/passwd
#例4 统计某个文件夹下的文件占用的字节数
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
#以M为单位显示,注意,统计不包括文件夹的子目录
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'
# 统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹)
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ",size/1024/1024,"M"}'
9.linux命令自省
man
man sed # man是manual缩写
help
help cd # 内部命令
sed --help # 外部命令
#shell(命令解释器)自带的命令称为内部命令,其他都是外部命令
info
info ls #info帮助比help更详细,作为help的补充
10.常用的linux命令
1.初始化项目权限: umask 007
2.查看xx.so文件属于那个库 yum whatprovides xxx.so
3.查看磁盘空间:df -h
4.查看系统版本:cat /etc/*release
1 | 2 |
---|---|
-z | 检测字符串长度是否为0,为0返回 true。 |
-n | 检测字符串长度是否不为 0,不为 0 返回 true。 |
1 | 2 |
---|---|
-i | 逐行记录每一次logger的进程ID |
-t | 指定标记记录 |
#在/var/log/messages文件中记录为 lp[123456]:hello
logger -i -t lp "hello"
7.shell 脚本中$ , , ,#,$?分别代表什么意思?
1 | 2 |
---|---|
$* | 这个程式的所有参数,此选项参数可超过9个。 |
$# | 这个程式的参数个数 |
$$ | 这个程式的PID(脚本运行的当前进程ID号) |
$@ | 跟$*类似,但是可以当作数组用 |
#防止$var为空时报错
x"abcd" = x"$var"
9.read
1 | 2 |
---|---|
-p | 给出提示符。默认不支持"\n"换行,要换行需要特殊处理 |
-r | 禁止反斜线的转义功能.这意味着"\" 会变成文本的一部分 |
read -p -r "Do you want install?"
10.getopt的使用
11.diff命令
语法
diff [选项] old_file new_file
选项 | 说明 |
---|---|
-r | 递归比较各子目录下的文件 |
-N | 将不存在的文件当作空文件 |
-u | 默认输出每个修改前后的3行,也可以用-u5等指定输出更多上下文。 |
-B | 忽略对空行的比较 |
-w | 忽略所有空格和制表符。例如,if ( a == b ) 与 if(a==b) 相等。 |
举例
diff -Nur src src_new >src.patch
12.patch打补丁
patch
指令让用户利用设置修补文件的方式,修改,更新原始文件
语法:
path -p剥离层级 < 补丁文件