目录
1、函数
1.1 系统函数
(1)basename基本语法
- basename [string / pathname] [suffix]
- 功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
选项:
- suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
用法:
截取该/home/test/banzhang.txt路径的文件名称
[root@localhost test]# basename /home/test/banzhang.txt
banzhang.txt
[root@localhost test]# basename /home/test/banzhang.txt .txt
banzhang
(2)dirname基本语法
- dirname 文件绝对路径
- 功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
练习:
获取banzhnag.txt文件的目录
[root@localhost test]# dirname /home/test/banzhang.txt
/home/test
1.2 自定义函数
基本语法
[ function ] funname[()] //中括号内容为可选项,可不写
{
Action;
[return int;] //这里的返回值,一般通过$?来获得
}
funname
注意:
- 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
- 函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
练习:计算两个输入参数之和
[root@localhost test]# vim sum.sh
#!/bin/bash
function sum()
{
s=0
s=$[$1 + $2]
echo $s
} //到这里只是定义了sum函数
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2; //这里引用sum函数
[root@localhost test]# bash sum.sh
Please input the number1: 1
Please input the number2: 2
3
2、Shell工具(一)
2.1 Cut
Cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。Cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
cut [选项参数] filename //说明:默认分隔符是制表符
选项参数 | 功能 |
-f | 列号,提取第几列 |
-d | 分隔符,按照指定分隔符分割列 |
练习:
[root@localhost test]# vim cut.txt //加入文本
dong shen
guan zhen
wo wo
lai lai
le le
[root@localhost test]# cut -d " " -f 1 cut.txt //切割cut.txt第一列
dong
guan
wo
lai
le
[root@localhost test]# cut -d " " -f 2,3 cut.txt //切割cut.txt第二、三列
shen
zhen
wo
lai
le
[root@localhost test]# cat cut.txt | grep guan | cut -d " " -f 1 //切割cut.txt文件中的guan
guan
选取系统PATH变量值,第2个“:”开始后的所有路径:
[root@localhost test]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost test]# echo $PATH | cut -d : -f 3-
/usr/sbin:/usr/bin:/root/bin
[root@localhost test]#
切割ifconfig 后打印的IP地址:
这里我们考虑到可能不止一块网卡有地址这个选项,所以我们首先得显示我们要切割的网卡。
[root@localhost test]# ifconfig ens160
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.67.133 netmask 255.255.255.0 broadcast 192.168.67.255
ether 00:0c:29:8b:4b:9c txqueuelen 1000 (Ethernet)
RX packets 17007 bytes 18860791 (17.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9496 bytes 638891 (623.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost test]# ifconfig ens160 | grep inet
inet 192.168.67.133 netmask 255.255.255.0 broadcast 192.168.67.255
[root@localhost test]# ifconfig ens160 | grep inet | cut -d" " -f2
这里的基本思路就是先利用显示命令和grep等,先将关键行过滤出来,再对关键行进行分割。
2.2 Sed
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
sed [选项参数] 'command' filename
选项参数 | 功能 |
-e | 直接在指令列模式上进行sed的动作编辑。 |
命令 | 功能描述 |
a | 新增,a的后面可以接字串,在下一行出现 |
d | 删除 |
s | 查找并替换 |
注:这里的参数仅仅为常用参数,并非所有参数。
[root@localhost ~]# vim sed.txt //导入原始数据
dong shen
guan zhen
wo wo
lai lai
le le
[root@localhost ~]# sed '2a mei nv' sed.txt //将“mei nv”这个单词插入到sed.txt第二行下,打印。
dong shen
guan zhen
mei nv
wo wo
lai lai
le le
[root@localhost ~]# sed 'a2 mei nv' sed.txt //这个是Sed参数a2的显示,和2a还是有区别的
dong shen
2 mei nv
guan zhen
2 mei nv
wo wo
2 mei nv
lai lai
2 mei nv
2 mei nv
le le
2 mei nv
注:使用Sed显示之后源文件是不会变化的。
[root@localhost ~]# sed '/wo/d' sed.txt //删除sed.txt文件所有包含wo的行
dong shen
guan zhen
lai lai
le le
[root@localhost ~]# sed 's/wo/ni/g' sed.txt //将sed.txt文件中wo替换为ni,‘g’表示global,全部替换
dong shen
guan zhen
ni ni
lai lai
le le
[root@localhost ~]# sed -e '2d' -e 's/wo/ni/g' sed.txt //将sed.txt文件中的第二行删除并将wo替换为ni;当需要多次操作时,使用-e选项。
dong shen
ni ni
lai lai
le le