shell脚本介绍以及常⽤命令
Shell脚本
Shell Script,Shell与Windows/Dos下的相似,也就是⽤各类命令预先放⼊到⼀个⽂件中,⽅便⼀次性执⾏的⼀个,主要是⽅便进⾏设置或者管理⽤的。但是它⽐Windows下的批处理更强⼤,⽐⽤其他编程的程序效率更⾼,毕竟它使⽤了Linux/Unix下的命令。
换⼀种说法也就是,shell script是利⽤shell的功能所写的⼀个程序,这个程序是使⽤,将⼀些shell的语法与指令写在⾥⾯,然后⽤正规表⽰法,管线命令以及数据流重导向等功能,以达到我们所想要的处理⽬的
shell和shell脚本的区别:
shell是什么呢?确切⼀点说,Shell就是⼀个,它的作⽤就是遵循⼀定的语法将输⼊的命令加以解释并传给系统。它为⽤户提供了⼀个向Linux发送请求以便运⾏程序的接⼝系统级程序,⽤户可以⽤Shell来启动、挂起、停⽌甚3⾄是编写⼀些程序。 Shell本⾝是⼀个⽤C语⾔编写的程序,它是⽤户使⽤Linux的桥梁。Shell既是⼀种命令语⾔,⼜是⼀种(就是你所说的shell脚本)。作为命令语⾔,它互动式地解释和执⾏⽤户输⼊的命令;作为程序设计语⾔,它定义了各种和参数,并提供了许多在⾼阶语⾔中才具有的控制结构,包括循环和分⽀。它虽然不是 Linux系统的⼀部分,但它调⽤了系统内核的⼤部分功能来执⾏程序、创建⽂档并以并⾏的⽅式协调各个程序的运⾏。
交互式shell和⾮交互式shell
  交互式模式就是shell等待你的输⼊,并且执⾏你提交的命令。这种模式被称作交互式是因为shell与⽤户进⾏交互。这种模式也是⼤多数⽤户⾮常熟悉的:登录、执⾏⼀些命令、签退。当你签退后,shell也终⽌了。
  shell也可以运⾏在另外⼀种模式:⾮交互式模式。在这种模式下,shell不与你进⾏交互,⽽是读取存放在⽂件中的命令,并且执⾏它们。当它读到⽂件的结尾,shell也就终⽌了。
如下:
简单的实现系统巡检的命令:
date
[root@linuxprobe ~]# date
2020年 03⽉ 30⽇星期⼀13:00:48 CST
free –m
[root@linuxprobe ~]# free -m
total      used      free    shared    buffers    cached
Mem:          18261268558107388
-/+ buffers/cache:        871954
Swap:        204702047
df –Th
[root@linuxprobe ~]# df -Th
⽂件系统类型容量已⽤可⽤已⽤% 挂载点
/dev/mapper/rhel_linuxprobe-root xfs        18G  3.8G  14G  22% /
devtmpfs                        devtmpfs  905M  4.0K  905M    1% /dev
tmpfs                            tmpfs    914M  140K  914M    1% /dev/shm
tmpfs                            tmpfs    914M  8.9M  905M    1% /run
tmpfs                            tmpfs    914M    0  914M    0% /sys/fs/cgroup
/dev/sr0                        iso9660  3.5G  3.5G    0100% /mnt
/dev/sda1                        xfs      497M  125M  373M  26% /boot
写成⼀个简单的脚本test.sh
#!/bin/bash
date
free –m
df –Th
chmod +x test.sh
./test.sh
[root@linuxprobe ~]# ./test.sh
2020年 03⽉ 30⽇星期⼀13:02:50 CST
total      used      free    shared    buffers    cached
Mem:          18261266560107388
-/+ buffers/cache:        870956
Swap:        204702047
⽂件系统类型容量已⽤可⽤已⽤% 挂载点
/dev/mapper/rhel_linuxprobe-root xfs        18G  3.8G  14G  22% /
devtmpfs                        devtmpfs  905M  4.0K  905M    1% /dev
tmpfs                            tmpfs    914M  140K  914M    1% /dev/shm
tmpfs                            tmpfs    914M  8.9M  905M    1% /run
tmpfs                            tmpfs    914M    0  914M    0% /sys/fs/cgroup
/dev/sr0                        iso9660  3.5G  3.5G    0100% /mnt
/dev/sda1                        xfs      497M  125M  373M  26% /boot
shell 脚本中-d,-e,-f的区别
查看⽂件或者⽬录是否存在,经常⽤到-d,-e,-f,其中区别如下
-e filename 如果 filename存在,则为真
-d filename 如果 filename为⽬录,则为真
-f filename 如果 filename为⽂件,则为真
-L filename 如果 filename为链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-
x filename 如果 filename可执⾏,则为真
-s filename 如果⽂件长度不为0,则为真
-h filename 如果⽂件是软链接,则为真
filename1 -nt filename2 如果 filename1⽐ filename2新,则为真。filename1 -ot filename2 如果 filename1⽐ filename2旧,则为真。
-eq 等于
-ne 不等于
-gt ⼤于
-ge ⼤于等于
-lt ⼩于
-le ⼩于等于
shell脚本的常⽤命令
cat,head,tail命令
1.求/etc/passwd⽂件第20⾏内容
[root@linuxprobe ~]# cat -n /etc/passwd | head -20 | tail -1
20    avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
rev,tac命令
rev左右颠倒
tac上下颠倒
find命令
常⽤选项
-name
-type
-
user
-nouser
-group
-nogroup
-mtime
-size
可以使⽤ -o 或者 -a 连接多个条件
可以使⽤-exec或者-ok来执⾏shell命令
find /etc/ -name hosts -exec cp {} /tmp/ \;
如:
find /var/logs -type f -mtime +7 -exec rm {} \;
计划任务crond和crontab
*/10 * * * * 脚本|命令
&命令
当在前台运⾏某个作业时,终端被该作业占据;⽽在后台运⾏作业时,它不会占据终端。
xclock -update 1 & 后台运⾏
nohup命令
如果你正在运⾏⼀个进程,⽽且你觉得在退出帐户时该进程还不会结束,那么可以使⽤ n o h u p命令。该命令可以在你退出帐户之后继续运⾏相应的进程。 N o h u p就是不挂起的意思( n o hang up)。
该命令的⼀般形式为: nohup command &
nohup xclock -update 1 &
shell的通配符
*
[...]和[!...] [a-z] [0-9] [!a12d]
{..}
echo命令
-e 使转义符⽣效如: 解释\t \n含义
-n 不换⾏输出
字颜⾊:30—–37
echo -e “\033[30m ⿊⾊字 \033[0m”
echo -e “\033[31m 红⾊字 \033[0m”
echo -e “\033[32m 绿⾊字 \033[0m”
echo -e “\033[33m 黄⾊字 \033[0m”
echo -e “\033[34m 蓝⾊字 \033[0m”
echo -e “\033[35m 紫⾊字 \033[0m”
echo -e “\033[36m 天蓝字 \033[0m”
echo -e “\033[37m ⽩⾊字 \033[0m”
[root@linuxprobe ~]# echo -e "\033[31m 红⾊字 \033[0m"
红⾊字
字背景颜⾊范围:40—–47
echo -e “\033[40;37m ⿊底⽩字 \033[0m”
echo -e “\033[41;37m 红底⽩字 \033[0m”
echo -e “\033[42;37m 绿底⽩字 \033[0m”
echo -e “\033[43;37m 黄底⽩字 \033[0m”
echo -e “\033[44;37m 蓝底⽩字 \033[0m”
echo -e “\033[45;37m 紫底⽩字 \033[0m”
echo -e “\033[46;37m 天蓝底⽩字 \033[0m”
echo -e “\033[47;30m ⽩底⿊字 \033[0m
[root@linuxprobe ~]# echo -e "\033[41;37m 红底⽩字 \033[0m"
printf命令
[root@linuxprobe ~]# printf aa
aa[root@linuxprobe ~]#
[root@linuxprobe ~]# printf "aa\n"
aa
格式化输出
[root@linuxprobe ~]# printf "%s,%s,%d\n" good job 123
good,job,123
%s 字符串 %d⼗进制整数
read命令
可以使⽤read语句从键盘或⽂件的某⼀⾏⽂本中读⼊信息,并将其赋给⼀个变量。如果只指定了⼀个变量,那么 read将会把所有的输⼊赋给该变量,直⾄遇到第⼀个⽂件结束符或回车。
如:
赋值
[root@linuxprobe ~]# read name
zhang san
[root@linuxprobe ~]# echo $name
zhang san
赋多值
[root@linuxprobe ~]# read firstname lastname
zhang san
[root@linuxprobe ~]# echo $firstname $lastname
zhang san
[root@linuxprobe ~]# echo $firstname
zhang
[root@linuxprobe ~]# echo $lastname
san
交互式
[root@linuxprobe ~]# read -p "输⼊姓名: " name
输⼊姓名: zhang san
[root@linuxprobe ~]# echo $name
zhang san
|管道命令
管道(Pipe)实际是⽤于进程间通信的⼀段共享内存. 创建管道的进程称为管道服务器,连接到⼀个管道的进程为管道客户机
管道命令的两个作⽤:
1.管道两边产⽣两个⼦进程
2.前⼀个进程的标准输出和后⼀个进程的标准输⼊
注意以下情况不能赋值
echo 123 | read aa
echo $aa
重定向(⽂件描述符)
⽂件描述符:进程连接到⽂件时,获得的⼀个标记.当进程操作⽂件时,⾸先
打开⽂件获得打开⽂件的⼀个状态,给它⼀个标记成为⽂件描述符
0标准输⼊
1标准输出
2标准错误输出
> >> 定向符(重定向) >覆盖 >>追加
1> 标准正确输出,⽂件存在则覆盖,不存在则创建
1>> 标准正确输出,⽂件存在则追加,不存在则创建
2> 标准错误输出,⽂件存在则覆盖,不存在则创建
2>> 标准错误输出,⽂件存在则追加,不存在则创建
&> 标准正确和标准错误输出,⽂件存在则覆盖,不存在则创建
cat < /dev/sda > /dev/null 测试改变⽂件描述符
ls >cleanup.out 2>&1
在上⾯的例⼦中,我们将 ls命令的输出重定向到 cleanup.out⽂件中,⽽且其错误也被重定向到相同的⽂件中。
2>&1 标准错误输出定向到标准正确输出
< 输⼊重定向后边跟的是⽂件 > >>
<< here document 后边跟的是⼀个⽂本
如下
[root@linuxprobe ~]# cat & <<EOF
> dsadsadsa
> cxzcxzcxz
> qwewqewqe
> EOF
[root@linuxprobe ~]#
dsadsadsa
cxzcxzcxz
qwewqewqe
[[root@linuxprobe ~]# fdisk /dev/sda <<EOF
> n
>
> +200M
> w
当前页面脚本发生错误> EOF
<<<here string 后边跟字符串直接交给⽂本如:
[root@linuxprobe ~]# cat& <<<kkkkk
[root@linuxprobe ~]#
kkkkk
tee命令
tee命令作⽤可以⽤字母 T来形象地表⽰。它把输出的⼀个副本输送到标准输出,另⼀个副本拷贝到相应的⽂件中。如果希望在看到输出的同时,也将其存⼊⼀个⽂件, 这种情况可以使⽤tee命令
如:
[root@linuxprobe ~]# who |
root    :02020-03-3117:01 (:0)
root    pts/02020-03-3117:01 (:0)
[root@linuxprobe ~]#
root    :02020-03-3117:01 (:0)
root    pts/02020-03-3117:01 (:0)
[root@linuxprobe ~]# find /etc -name hosts |
/etc/avahi/hosts
/etc/hosts
[root@linuxprobe ~]#
/etc/avahi/hosts
/etc/hosts
sort命令
Linux sort命令⽤于将⽂本⽂件内容加以排序
sort可针对⽂本⽂件的内容,以⾏为单位来排序。
sort [-bcdfimMnr][-o<;输出⽂件>][-t<;分隔字符>][+<;起始栏位>-<;结束栏位>][--help][--verison][⽂件]
-b 忽略每⾏前⾯开始出的空格字符。
-c 检查⽂件是否已经按照顺序排序。
-d 排序时,处理英⽂字母、数字及空格字符外,忽略其他的字符。
-f 排序时,将⼩写字母视为⼤写字母。
-i 排序时,除了040⾄176之间的ASCII字符外,忽略其他的字符。
-m 将⼏个排序好的⽂件进⾏合并。
-M 将前⾯3个字母依照⽉份的缩写进⾏排序。
-n 依照数值的⼤⼩排序。
-u 意味着是唯⼀的(unique),输出的结果是去完重了的。
-o<;输出⽂件> 将排序后的结果存⼊指定的⽂件。
-r 以相反的顺序来排序。
-t<;分隔字符> 指定排序时所⽤的栏位分隔字符。
+<;起始栏位>-<;结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前⼀栏位。
--help 显⽰帮助。
--version 显⽰版本信息。