简介
变量是脚本语言的核心,shell脚本又是无类型的。变量本质上存储数据的一个或多个计算机内存地址,分为本地变量(用户当前shell生命期使用,随shell进程的消亡而无效,类似局部变量)、环境变量(适用于所有由登录进程所产生的子进程)和位置参数(向shell脚本传递参数,只读)。而shell使用变量就需要引用,它们密切相关。
一.diff命令
diff命令在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。
- -u:会将不同的地方放在一起,紧凑易读;
- -r: 递归比较目录下的所有文件;
- 利用diff命令生成补丁
-
文件和文件的比较:
# diff -u chinaitsoft.txt chinaitsoft_v2.txt --- chinaitsoft.txt +++ chinaitsoft_v2.txt @@ -1,4 +1,6 @@ ---@@代表一段范围 jinan -代表第一个文件 +changqing linux chinasotf +teacher feng
# diff -u chinaitsoft.txt chinaitsoft_v2.txt >v1-to-v2.patch 生成补丁,补丁叫作v1-to-v2.patch
patch 打补丁命令
用途:用来打补丁修补文件
格式:patch [选项] 原始文件 < 补丁文件
- -pN: N表示忽略N层路径;
- -R: 还原到老版本。
注意事项: - 如果打多个补丁,注意先后顺序;
- 打补丁前不要修改源文件。
# patch chinaitsoft.txt <v1-to-v2.patch patching file chinaitsoft.txt # diff chinaitsoft.txt chinaitsoft_v2.txt
还原到原来的版本--->撤销打补丁 # patch -R chinaitsoft.txt <v1-to-v2.patch patching file chinaitsoft.txt # diff chinaitsoft.txt chinaitsoft_v2.txt 1a2 > changqing 3a5 > fenglaoshi
- 目录和目录的比较
1.新建目录及子目录和普通的文件 [root@chinaitsoft lianxi]# mkdir qq [root@chinaitsoft lianxi]# cd qq/ [root@chinaitsoft qq]# ls [root@chinaitsoft qq]# cp /etc/hosts . [root@chinaitsoft qq]# ls hosts [root@chinaitsoft qq]# mkdir image sound [root@chinaitsoft qq]# ls hosts image sound [root@chinaitsoft qq]# cd image/ [root@chinaitsoft image]# ls [root@chinaitsoft image]# echo 123 >1.txt [root@chinaitsoft image]# ls 1.txt [root@chinaitsoft image]# [root@chinaitsoft image]# cd .. [root@chinaitsoft qq]# ls hosts image sound [root@chinaitsoft qq]# cd sound/ [root@chinaitsoft sound]# echo "789" >3.txt [root@chinaitsoft sound]# ls 3.txt [root@chinaitsoft sound]# cd .. [root@chinaitsoft qq]# [root@chinaitsoft qq]# cd .. 2.生成一个升级版本的目录 -r 递归的去比较子文件夹里的内容 [root@chinaitsoft lianxi]# cp qq qqv2 -r [root@chinaitsoft lianxi]# diff -ur qq qqv2 3.更新qqv2里的内容 [root@chinaitsoft lianxi]# cd qqv2 [root@chinaitsoft qqv2]# ls hosts image sound [root@chinaitsoft qqv2]# cp /etc/passwd . [root@chinaitsoft qqv2]# ls hosts image passwd sound [root@chinaitsoft qqv2]# cd sound/ [root@chinaitsoft sound]# echo "8900" >6.txt [root@chinaitsoft sound]# cd .. [root@chinaitsoft qqv2]# ls hosts image passwd sound [root@chinaitsoft qqv2]# echo "123456" >hosts [root@chinaitsoft qqv2]# ls hosts image passwd sound [root@chinaitsoft qqv2]# [root@chinaitsoft qqv2]# cd .. [root@chinaitsoft lianxi]# diff -Nur qq qqv2 -N 如果没有文件,就拿一个空文件和别的目录里的文件比较。
比较文件夹生成补丁: [root@chinaitsoft lianxi]# diff -Nur qq qqv2 >patch-v2.txt
/u/howard/src/blurfl/blurfl.c -p3 的效果就是去掉第3个/前面的内容,效果如下: src/blurfl/blurfl.c -p4 的效果就是去掉第4个/前面的内容,效果如下: blurfl/blurfl.c
cut命令(截取)
从文本文件或者文本流中提取文本列
格式:cut -选项 提取范围 文本文件常见选项- -c:从指定提取范围中提取字符;
- -f:从指定提取范围中提取字段(=列);
- -d:指定分隔符默认是Tab。
#cut -d “:” -f 1,7 /etc/passwd #who | cut -d ' ' -f1,6 提取范围
- n:第n项;
- n-:第n项到行尾;
- -m:行首到第m项;
- n,m:第n项和第m项—单个的截取;
- n-m:第n项到第m项。
# cat name.txt |cut -c 2 将文件里的每一行的第2个字符截取出来 u 1 1 2 3
# cat name.txt |cut -c 2-5 截取第2个字符到第5个字符 umbe 12 11 2 3 # cat name.txt |cut -c -10 ---行首到第十项 number nam 112 l 111 l 22 zh 23 de # cat name.txt |cut -c 5- ---第五项到末尾 er name age address phone liu 18 shandong 123 li 20 hennan 345 zhang 16 beijing 789 deng 86 hubei 467 # cat name.txt number name age address phone 112 liu 18 shandong 123 111 li 20 hennan 345 22 zhang 16 beijing 789 23 deng 86 hubei 467 # cat name.txt |tr -s " "|cut -d " " -f 3 age 18 20 16 86 # cat name.txt |tr -s " "|cut -d' ' -f3 age 18 20 16 86
sort命令(不改变源文件)
作用:排序。默认按每行的第一个字符排序。
- -n:按数值大小进行排序;
- -r:递减排序(整行整行的处理) reverse;
- -k 3 指定第三列为排序键;
- -t: 指定字段分割符(默认分隔符是空白(空格、Tab))。
PS:
sort排序是按照行来排序的,可以理解为一行是一个整体!!uniq命令
数据的实例统计。
作用:删除经过排序后的数据的重复记录。通常和sort连用。sort -n 文件 | uniq- -c:统计特定记录出现的次数;
- -u:只显示唯一的行;
- -d:只显示重复的行。
# cat access_log |awk '{print $1}'|sort |uniq -c|sort -nr|head -3 ---只取第一列 666 172.16.68.155 648 172.16.70.199 490 172.16.88.88
字符转换
tr 的作用一:替换(不改变源文件)
作用:字符转换工具
只能对stdin操作,不能直接对文件操作
格式: tr set1 set2 (同一位置set2替换set1)
例① 普通的替换# echo 123456123456|tr 345 abc 12abc612abc6
例② 在文本里的替换
# tr heze jinan < fuxingkai.txt fuxingkai njongyiyang jana laarning linux
所以,并不能单词替换单词,仅仅是单个字符的一一对应替换!
例③ [ ]中括号表示范围的替换
# tr [a-z] [A-Z] <fuxingkai.txt FUXINGKAI ZHONGYIYANG HEZE LEARNING LINUX
例④:
# tr ':' '\n' <fuxingkai.txt 将文件中的:全部替换为换行
tr的作用二:删除
tr -d [0:9] 删除0至9的数字 tr -d ‘%’ 删除%字符
tr的作用三:压缩(去重)
tr -s SET 将连续相同的字符压缩成一个字符 # echo "1 2 3 4"|tr -s ' ' '\t' 1 2 3 4 (\t 代表制表符)
单引号和双引号的不同
- 单引号:输出纯字符,特殊符号失去作用;
- 双引号:元字符可以有特殊含义。
# meinv=qianqian ---定义变量meinv,赋值qianqian # echo "$meinv" ---输出meimv的值 qianqian # echo '$meinv' ---输出$meinv $meinv
$ 元字符:能代表其他含义的字符,有特殊含义的字符,并不是代表本身字符的含义。
&& 和 ||
&& 表示前一条命令执行成功时,才执行后一条命令
方式:command1 && command2
如果command1执行成功,则执行command2
|| 表示上一条命令执行失败后,才执行下一条命令
方式:command1 || command2
如果command1执行失败,则执行command2 -
test
-
- test 命令与[] 等同
test "$A" == "$B" 等同于 [ "$A" == "$B" ]
linux中shell编程中的test常见用法: 1. 判断表达式 if test #表达式为真 if test ! #表达式为假 test 表达式1 –a 表达式2 #两个表达式都为真 test 表达式1 –o 表达式2 #两个表达式有一个为真 test 表达式1 ! 表达式2 #条件求反 2. 判断字符串 test –n 字符串 #字符串的长度非零 test –z 字符串 #字符串的长度是否为零 test 字符串1=字符串2 #字符串是否相等,若相等返回true test 字符串1!=字符串2 #字符串是否不等,若不等返回false 3. 判断整数 test 整数1 -eq 整数2 #整数相等 test 整数1 -ge 整数2 #整数1大于等于整数2 test 整数1 -gt 整数2 #整数1大于整数2 test 整数1 -le 整数2 #整数1小于等于整数2 test 整数1 -lt 整数2 #整数1小于整数2 test 整数1 -ne 整数2 #整数1不等于整数2 4. 判断文件(常用) test File1 –ef File2 两个文件是否为同一个文件,可用于硬连接。主要判断两个文件是否指向同一个inode。 test File1 –nt File2 判断文件1是否比文件2新 test File1 –ot File2 判断文件1比是否文件2旧 test –e File #文件是否存在 test –f File #文件是否为正规(普通)文件 test –L File #文件是否是一个符号链接(同-h) test –S File #文件是否是套接字 test –b file #文件是否是块设备文件 test –d File #文件是否是目录 test –c File #文件是否是字符设备文件
-
编写脚本——判断文件是否存在,存在的话,显示出该文件的类型
[root@localhost mnt]# vim file_check.sh [root@localhost mnt]# cat file_check.sh ################################## # Author: xiaozhuang # # Version: # # Mail: # # Date: 2018-06-15 # # Description: # # # ################################## #!/bin/bash [ -z "$1" ]&&{ echo "Please input a filename after script!!" exit 1 } [ -e "$1" ]||{ echo "$1 not exist!!" exit 0 } [ -f "$1" ]&&{ echo "$1 exists and is a regular file !!" exit 0 } [ -d "$1" ]&&{ echo "$1 exists and is a directory !!" exit 1 } [root@localhost mnt]# sh file_check.sh Please input a filename after script!! [root@localhost mnt]# sh file_check.sh tutu tutu not exist!! [root@localhost mnt]# touch tutu [root@localhost mnt]# sh file_check.sh tutu tutu exists and is a regular file !! [root@localhost mnt]# mkdir butter [root@localhost mnt]# sh file_check.sh butter butter exists and is a directory !! [root@localhost mnt]#