shell命令及编写脚本
#####################1.shell简介#####################################################3
Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。
shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。
shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。
shell脚本(能运行的文本)
python是写脚本的语言。脚本为解释性语言,其他高级语言为描述性语言
脚本运行效率低。不如高级语言。(创造性开发语言,创造新的东西)
脚本解释器是一个shell。
用shell脚本保存执行动作,用脚本判定命令的执行条件,用脚本来实现动作的批量执行。
脚本是解释性语言,脚本内容需要解释器解释,不需要编译可以直接用,但运行效率低,用于记录系统命令,是以文本形式存在的
C和JAVA等是描述性语言,是将动作描述给系统,运行效率高
############################2.shell脚本基础入门#################################################
脚本一般以.sh后缀,但没有强制要求。
eg:
vim hello.c 写脚本
#include<stdio.h>
main()
{
printf("hello world\n");
}
yum install gcc -y ####安装解释器
gcc hello.c ###生成默认文件a.out 注意:cat a.out查看到的乱码为解释器转换后的内容
gcc hello.c -o hello ###指定生成文件hello
执行脚本:
法一(没有添加执行权限下):sh ***.sh
法二(有执行权限,已绝对路径方式):
chmod +x hello.sh(给权限)
./hello (绝对路径)
vim hello.sh(写规范脚本)
#!/bin/bash (先执行这个,加载对写的内容的转换为电脑可识别的)
echo hello world
执行:sh hello.sh
或者chmod +x hello.sh /mnt/hello.sh
可以给一个不会结束的脚本(watch -n 1 date),再ctrl+c,再ps f查看到脚本的具体命令及/bin/*****
插播:在虚拟机下,可以cd /root/Desktop到桌面
用脚本输出主机IP:脚本里写ifcinfig eth0 | grep inet
在脚本的#!/bin/bash之前一般会有注释(author,date,version等等)
那么如何写呢?(每写一个脚本都要写注释太麻烦,可在/etc/vimrc下添加配置文件,永久有效)
第一种(按快捷键显示注释)
这个注意:1.同行添加
2.实时时间显示
3.map<F4> ___(快捷键F4显示注释)
vim /etc/vimrc编写完成后,试着建立一个脚本,按F4,验证
第二种(新脚本自动显示注释,旧脚本不再添加,以免重复添加)
注释掉map<F4>......这一行(在map前加左双引号即可“map)
然后在紧接的下一行写:autocmd Buf*** ** ******
如何检查两个脚本的不同
diff命令是用来比较两个文件或目录的不同
eg:
vim westos
hello 123
vim westos2
helo 123
westos
diff westos westos1(注意是和第二个文件(westos1)为基础比较不同
1a2
> westos表示文件1添加westos就和文件2相同。
a表示添加,c表示更改,d表示删除,<表示第一个文件中的内容,>表示 第二个文件中的内容。
打补丁:
(1)给脚本(文件)打补丁
diff -u westos westos1(比较两者不同,并输出补丁)
diff -u westos westos1 > westos.path(将补丁存入westos.path)
yum install patch -y(安装打补丁的软件)
patch westos westos.path(给第一个脚本添加补丁,修改为和第二个脚本一样的内容。并且第一个脚本原内容不会保留)
path -b westos westos.path(给第一个脚本添加补丁,修改为和第二个脚本一样的内容。并且第一个脚本原内容会保留,保留在生成的新文件westos.orig中)
(2)给目录打补丁
mkdir linux
mkdir unix
touch linux/westos
diff -r linux/ unix/(比较两目录中的文件差别)
cut命令多用于字符截取
cut -d 指定分隔符
cut -f 1,7 指定截取第一列和第七列
cut -f 1-7 指定截取第一列到第七列
(-d和-f经常是一块使用的)
cut -d : -f 1 passwd
cut -d : -f 1,7 passwd
cut -c 1,4 指定截取第一个字符和第七个字符
cut -c 1-4 指定截取第一个字符到第七个字符
eg:执行脚本ip_show.sh,显示本机ip
vim ip_show.sh
ifconfig eth0 | grep "inet"|cut -d " " -f 10
或者ifconfig eth0 | awk -F " " '/inet\>/{printf $2}'
awk:报告生成器(inet表示inet这行,$2指本行第二列)
sh -x ip_show.sh(如果脚本错误,显示脚本具体错误信息,+表示命令,无+的表示错误信息输出,对应的+那一行命令错误)
&&(true)和||(fause)
&&用来执行条件成立后执行的命令
||用来执行条件不成立后执行的命令
eg:
ping -c1 -w1 172.25.254.100 &> /dev/null && echo 172.25.254.100 is up || echo 172.25.254.100 is down
sort命令多用于字符排序
sort -n 纯数字排序
sort -r 倒序
sort -u 去掉重复数字
sort -o 输出到指定文件中
sort -t 指定分隔符
sort -k 指定要排序的列
eg:sort -urn westos -o file
sort -t : -k 2 westos
uniq命令对重复字符作相应的处理(一般和sort共用)
uniq -u 显示唯一的行的数字
uniq -d 显示重复的行的数字
uniq -c 每行显示一次并统计重复次数
eg:sort -n westos | uniq -c
1 1
3 2
1 5
次数 数字
sort -n westos | uniq -d
2
5
sort -n westos | uniq -u
1
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"]大于
eg:a=1
b=1
test "$a"="$b" && echo yes || echo no
echo $c
[-z "$c"]&& echo yes || echo no (判断$c是否为空,为空输出为yes)
[-n "$c"]&& echo yes || echo no (判断$c是否不为空,为空输出为no)
编写脚本,判断ip主机是否存在,并错误命令输入格式给出提示
#!/bin/bash
[-z "$1"]&&{
echo “please give me a ipaddress!!“
echo 1 //正常退出
}
ping -c1 -w1 $1 &> /dev/null && {
echo "$1 is up"
}||{
echo "$1 is down"
}
编写脚本,判断输入数字是否在0~10之间,并错误命令输入格式给出提示
#!/bin/bash
[-z "$1"]&&{
echo ”please input a number after script!!“
echo 1 //正常退出
}
[ "$1" -gt "0" -a "$1" -lt "10" ]&& { —a表示与,-o表示或
echo "$1 is between 1~10"
}||{
echo "$1 is not between 1~10"
}
["file1" -ef "file2"] ###判断两个文件编号是否相同
eg: touch file
ln /mnt/file /mnt/file1 (ln表示软链接,本例创建file1软链接)
####ln之后file和file1的编号相同
测试:["/mnt/file" -ef "/mnt/file1"]&& echo yes || echo no
["file1" -ot "file2"] ###判断两个文件创建时间先后,若file1早与file2,则输出yes;
-o可理解为old
eg:
测试:["/mnt/file" -ot "/mnt/file1"]&& echo yes || echo no
["file1" -nt "file2"] ###判断两个文件创建时间先后,若$1早于$2为no,否则为yes;
-n可理解为new
eg:
测试:["/mnt/file" -nt "/mnt/file1"]&& echo yes || echo no
test命令
[-e "file"] 判断文件是否存在
[-f "file"] 判断文件是否是普通文件
[-L "file"] 查看是否是软链接
[-S "file"] 查看是否是套接字
[-b "file"] 查看是否是块设备(block device)
[-d "file"] 查看是否为目录
[-c "file"] 查看是否是字符文件
eg:可编写一个脚本:vim file.sh
#!/bin/bash
["$1" "/mnt/file"]&& echo yes || echo no
在终端cd /mnt/
ls 无file
sh file.sh -e 判断文件不存在
touch file
sh file.sh -e 判断文件存在
sh file.sh -f 判断文件是普通文件
sh file.sh -L 查看不是软链接
rm -fr file
ln -s /mnt/file.sh /mnt/file
ll
sh file.sh -L 查看是软链接
sh file.sh -S 查看不是套接字
yum install mariadb-server -y
systemctl start mariadb
ls /var/lib/mysql/
ll
cp /var/lib/mtsql/mysql.sock /mnt/file
rsync -D /var/lib/mtsql/mysql.sock /mnt/file (rsync作用(可能是传输)
ll
sh file.sh -S 查看是套接字
sh file.sh -b 查看不是块设备
rm -fr file
rsync -D /dev/vdb /mnt/file
sh file.sh -b 查看是块设备
rm -fr /mnt/file
mkdir /mnt/file
sh file.sh -d 查看是目录
sh file.sh -c 查看不是字符文件
rm -fr /mnt/file
rsync -D /dev/pts/1 /mnt/file
ll
sh file.sh -c 查看是字符文件
编写一个脚本,判断文件类型
#!/bin/bash
[ -z "$1" ]&&{
echo "please input a file name after script!!"
exit 1
}
[-e "$1" ]||{
echo "$1 is not exist!!"
exit 0
}
[-L "$1" ]&&{
echo "$1 is a link"
exit 1
}
以此类推写下去.................................
:wq
tr命令作用是改变大小写
tr 'a-z' 'A-Z' < test.sh (将此脚本小写全部转换为大写)
tr 'A-Z' 'a-z' < test.sh (将此脚本大写全部转换为小写)
eg:
编写一个脚本,输入无论是大写还是小写都能识别
#!/bin/bash
WORD=$(echo $1 | tr 'A-Z' 'a-z')
[ "$WORD"="hello" ]&&{
echo yes
}||{
echo no
}
测试:sh test.sh hello 输出为yes
sh test.sh HELLO 输出也为yes