一、什么是shell?
shell也是操作系统中的一个软件,它包在linux内核的外面,为用户和内核之间的交互提供了一个接口;系统中的命令都是用shell去解释;shell接收系统回应的输出并显示到屏幕中;
bash = GNU Bourne-Again Shell
二 、什么是shell脚本?
- 脚本是一种解释型语言;
- 用shell脚本保存执行动作;
- 用脚本判定命令的执行条件;
- 用脚本来实现懂做的批量执行;
- 记录系统命令以及命令之间的逻辑关系;
三、脚本和 C、Java 等描述性语言的区别
- 脚本是解释性语言(命令用解释器解释),运行效率低;开发过程较为简单;
- C、Java 等描述性语言是将动作描述给系统,运行速率较高;具有创造性,需要开发软件去编译,编译是一个将描述性语言翻译成机器可以读懂的语言过程;
示例:(1)C语言编写:
yun install gcc -y //安装编译软件
vim /mnt/hello.c //编辑一个.c文件
#include <stdio.h> //标准输入输出库函数
void mian ()
{
printf("hello,word!\n");
}
gcc hello.c //编译,生成一个a.out文件
./a.out //运行
(2)shell脚本编写:
vim /mnt/hello.sh //编写脚本
#!/bin/bash //幻数;这行是有含义的:脚本运行时,先运行此程序
echo "hello,world!"
chmod +x /mnt/hello.sh //添加可执行权限
/mnt/hello.sh //运行脚本
如果不加可执行权限,我们也可以直接执行命令:
sh /mnt/hello.sh
添加注释信息
[root@desktop ~]# vim /etc/vimrc
68 autocmd BufNewFile *.sh exec ":call WANGKANA()" //当新建一个sh文件时,会自动调用WANGKANA,完成注释信息的添加;
69 func WANGKANA()
70 call append(0,"###############################")
71 call append(1,"# Author: wangkana".(" #"))
72 call append(2,"# Version: ".(" #"))
73 call append(3,"# Mail: ".(" #"))
74 call append(4,"# Date: ".strftime("%Y-%m-%d").(" #"))
75 call append(5,"# Description: ".(" #"))
76 call append(6,"# ".(" #"))
77 call append(7,"###############################")
78 call append(8," ")
79 call append(9,"#!/bin/bash")
80 endfunc
[root@desktop mnt]# vim /mnt/test.sh //新建文件,可以看到注释信息被自动添加
1 ###############################
2 # Author: wangkana #
3 # Version: #
4 # Mail: #
5 # Date: 2018-06-09 #
6 # Description: #
7 # #
8 ###############################
9
10 #!/bin/bash
注意:如果想在有需要的时候添加注释信息,将68行替换成
map <F2> ms:call WANGKANA()<cr>'s
快捷键<F2>手动添加注释信息。(1)这里的F2可以换成去其他的按键,但是确保此键是没有其他用处的;
diff命令的使用
[num1,num2][a | c | d][num3,num4]
num1,num2 表示在第一个文件中的行数;
a 表示 添加 ——add;
c 表示 更改 ——change;
d 表示 删除 ——delete;
< 表示 第一个文件中的内容
> 表示第二个文件中的内容
num3,num4表示在第二个文件中的行数
1)比较两个文件的不同;
示例 1:
[root@client mnt]# cat test //test文件内容
hahaha
westos
[root@client mnt]# cat test1 //test1文件内容
hahaha
[root@client mnt]# diff test test1
2d1 // delete; 将第一个文件的第二行删除就和第二个文件一样了
< westos
[root@client mnt]# cat test //test文件内容
hahaha
linux
[root@client mnt]# cat test1 //test1文件内容
hahaha
westos
[root@client mnt]# diff test test1
2c2 //change ; 第一个文件的第二行改成第二个文件的第二行就一样了
< westos
---
> linux
[root@client mnt]# cat test //test文件内容
hahaha
[root@client mnt]# cat test1 //test1文件内容
hahaha
linux
[root@client mnt]# diff test test1
1a2 // add ; 第一个文件添加第二个文件的第二行就一样了;
> linux
示例 2 :生成补丁,打补丁
[root@client mnt]# yum install patch -y //安装软件
[root@client mnt]# cat test //test文件内容
hahaha
[root@client mnt]# cat test1 //test1文件内容
hahaha
linux
[root@client mnt]# diff -u test test1 > test.path 生成补丁test.path
[root@client mnt]# patch test test.path //打补丁,以test1为标准;
patching file test
[root@client mnt]# cat test //test文件内容
hahaha
linux
[root@client mnt]# cat test1 //test1文件内容
hahaha
linux
注意:如果想要保留原文件内容,执行命令:
patch -b test test.path
生成.orig文件,即原来文件内容
2)比较目录的不同 -r
[root@client mnt]# mkdir linux
[root@client mnt]# mkdir westos
[root@client mnt]# cd linux
[root@client linux]# touch file
[root@client mnt]# diff -r linux westos
Only in linux:file
cut 命令 : 多用于字符的截取
cut -d 指定分隔符
cut -f 1,7 | 1-7 指定截取的列;1,7截取第一列和第七列;1-7是截取第一列到第七列
cut -c 1,4 | 1-4 指定截取的字符位置;1,4截取第一个和第四个字符;1-4截取第一到第四个字符;
实例 :
要求:编写一个脚本,执行结果可以得到本台主机的ip;
vim ip_check.sh
#!/bin/bash
ifconfig eth0 | grep "inet " | cut -d " " -f 10
sh ip_check.sh
————-> 优化:
vim ip_show.sh
#!/bin/bash
ifconfig eth0 | awk -F " " '/inet\>/{print $2}' //awk数据报告器
sh ip_check.sh
ping 命令
ping -c1 -w1 172.25.254.10 &> /dev/null 检测是否可以ping通172.25.254.10,不管结果如何将结果打入到垃圾箱里; 其中,-w指定超时间隔 ;
实例:
要求:检验某个ip 是否可以ping通;
vim ping_check.sh
#!/bin/bash
ping -c1 -w1 "$1" &> /dev/null && echo $1 is up || echo $1 is down
sh ping_check.sh 172.25.254.74 //运行脚本
sort 命令: 排序
sort -n ## 纯数字排序
sort -r ## 倒序
sort -u ## 去掉重复数字
sort -o ## 输出到指定文件中
sort -t ## 指定分隔符
sort -k ## 指定要排序的列
示例 1:
示例 2:
shell脚本实例 3 :
要求:显示/mnt下最大的文件名
vim check_file.sh
#!/bin/bash
ls -Sl /mnt/ | grep -v total | awk -F " " 'NR==1{print $9}'
sh check_file.sh
uniq 命令 : 对重复字符做相应处理
uniq -u ##显示唯一的行
uniq -d ##显示重复的行
uniq -c ##每行显示一次并统计重复次数
示例:
test 命令
\ | && | | | |
---|---|---|
脚本的含义 | true | false |
C中的含义 | 与 | 或 |
test和[]等同;
即:test "$A" == "$B" 等同 [ "$A" == "$B" ]
[ "$A" = "$B" ] //等于
[ "$A" != "$B" ] //不等于
[ "$A" -eq "$B" ] //等于
[ "$A" -ne "$B" ] //不等于
[ "$A" -le "$B" ] //小于等于
[ "$A" -lt "$B" ] //小于
[ "$A" -ge "$B" ] //大于等于
[ "$A" -gt "$B" ] //大于
[ "$A" -ne "$B" -a "$A" -gt "$B" ] //-a 必须都满足条件
[ "$A" -ne "$B" -o "$A" -gt "$B" ] //-o 至少满足一个条件
[ -z "$A" ] //是否为空
[ -n "$A" ] //
[ "file1" -ef "file2" ] //-ef 表示是否为硬链接
[ "file1" -nt "file2" ] //-nt n表示new
[ "file1" -ot "file2" ] //-ot o表示old
[ -e "file" ] 是否存在
[ -f "file" ] 普通文件
[ -b "file" ] 块设备
[ -S "file" ] 套接字
[ -c "file" ] 字符设备
[ -L "file" ] 软链接
脚本实例 1:
利用脚本检查文件file属于哪个类型;
vim /mnt/file.sh
#!/bin/bash
[ "$1" "/mnt/file" ]&& echo yes || echo no
脚本实例 2:
要求:判断数字是否在10以内;
vim nm_check.sh
#!/bin/bash
[ -z "$1" ]&&{
echo please input a number !!
exit 1
}
[ "$1" -gt "0" -a "$1" -lt "10" ] && {
echo "$1 is in range"
}||{
echo "$1 is not in range"
}
脚本实例 3:
要求:输入一个文件名称,判断属于什么类型的设备,并输出;
vim file_check.sh
#!/bin/bash
[ -z "$1"]&&{
echo "please input a file name after scripts!!"
exit 1
}
[ -e "$1" ] || {
echo " $1 is not exit!!"
exit 0
}
[ -L "$1" ] && {
echo "$1 is a link"
exit 1 }
[ -f "$1" ] && {
echo "$1 is a common file"
exit 1 }
[ -S "$1" ] && {
echo "$1 is a taojiezi"
exit 1 }
[ -b "$1" ] && {
echo "$1 is a block file"
exit 1}
[ -d "$1" ] && {
echo "$1 is a directory"
exit 1}
[ -c "$1" ] && {
echo "$1 is a character device"
exit 1
}
tr 命令
tr ‘A-Z’ ‘a-z’ ##将大写字母转换成小写字母
脚本示例 4:
要求大小写字母不识别;
[root@client mnt]# vim text.sh
#!/bin/bash
WORD=$(echo $1 | tr 'A-Z' 'a-z') //将所有的大写字母全部转换成小写字母
[ "$WORD" = "hello" ] && {
echo yes
}||{
echo no
}
脚本示例 5:
vim /mnt/$#_check.sh
#!/bin/bash
eco/ho $#
脚本示例 6:
要求:
用户检验(如果是系统中存在的用户,输出用户已存在;如果是系统中不存在的用户,则建立并修改密码)
思路:
- 查看脚本后所跟字符是不是2串
- 检测第一串字符是不是一个用户
- 密码
vim /mnt/user_create.sh
#!/bin/bash
[ "$#" -eq "2" ]||{
echo "please input username and password!"
exit 1
}
check_user=`getent passwd $1`
[ -n "$check_user" ]&&{
echo "$1 is exist!"
exit 1
}
useradd $1
echo $2 | passwd --stdin $1