Shell脚本(一)-基础概念及入门字符编辑命令

Shell脚本是利用Shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些Shell的语法与命令写在里面,然后用正规表示法,管道命令以及数据流重定向等功能,达到我们所想要的处理的目的。

脚本格式

[root@desktop shell]# vim shell.sh        ##使用文本编辑器创建文件
#!/bin/bash                               ##    #!是约定的标记,告诉系统该脚本使用什么解释器来执行,即使用哪一种Shell
#Author                                   ##    其他#开头的内容表示注释行
#Version
echo "Hello world!"                       ##echo命令用于向窗口输出文本

脚本执行

[root@desktop shell]# sh shell.sh        ##sh直接执行
Hello world!
[root@desktop shell]# chmod +x shell.sh  ##增加可执行权限
[root@desktop shell]# ./shell.sh         ##绝对路径执行
Hello world!

单双引号的区别

单引号'':单引号中的任何字符都是普通字符
双引号"":双引号中可以解析变量
[root@desktop shell]# echo "$USER"
root
[root@desktop shell]# echo '$USER'
$USER

diff命令

diff命令用于对比文件的差异,如果对比的是目录,则会比较目录中相同文件名的文件
-b:不检查空白字符
-B:不检查空白行
-c:显示全部内容,并且标出不同之处
-i:不检查大小写
-p:若比较的文件为C语言的程序码文件时,显示差异所在的函数名称
-q:只显示有无差异,不显示详细内容
-r:比较子目录中的文件
-u:以合并的方式显示文件内容的不同
文件比较结果表达方式
a:表示添加
c:表示更改
d:表示删除
<:表示第一个文件的内容
>:表示第二个文件的内容
[root@desktop shell]# head -n 15 /etc/passwd > passwd
[root@desktop shell]# tail -n 15 /etc/passwd >> passwd 
[root@desktop shell]# diff passwd /etc/passwd                        ##对比passwd和/etc/passwd文件的差距
15a16,26                                                             ##passwd文件需要添加16至26行内容
> avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
> avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
> rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
> rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
> nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
> ovirtagent:x:175:175:RHEV-M Guest Agent:/usr/share/ovirt-guest-agent:/sbin/nologin
> postfix:x:89:89::/var/spool/postfix:/sbin/nologin
> sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
> chrony:x:998:996::/var/lib/chrony:/sbin/nologin
> student:x:1000:1000:Student User:/home/student:/bin/bash
> usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin

patch命令,修改不同文件
[root@desktop shell]# yum install patch -y        ##安装patch命令
[root@desktop shell]# diff passwd /etc/passwd > passwd.path    ##生成差异文件
[root@desktop shell]# patch passwd passwd.path    ##根据差异文件修改
patching file passwd

&&和||

&&用来执行条件成立后执行的动作
||用来执行条件不成立后执行的动作
[root@desktop shell]# vim check_ip.sh        ##创建一个测试脚本
#!/bin/bash                                  ##指定解释器为bash
ping -c1 -w1 $1 &> /dev/null && {            ##ping一次执行命令后所跟的第一串字符并将输出结果输出到/dev/null设备
        echo $1 is up                        ##如果ping成功则显示$1 is up
} || {
        echo $1 is down                      ##如果ping失败则显示$1 is down 
}
[root@desktop shell]# sh check_ip.sh 172.25.254.80
172.25.254.80 is up
[root@desktop shell]# sh check_ip.sh 172.25.254.180
172.25.254.180 is down

test命令

测试表达式是否成立,当条件成立时,返回直为0,否则为其他数字
test命令和[]相同
[root@desktop shell]# A=2
[root@desktop shell]# B=2
[root@desktop shell]# test $A = $B
[root@desktop shell]# echo $?
0
[root@desktop shell]# [ $A = $B ]
[root@desktop shell]# echo $?
0
常见的测试参数
测试文件状态
-e:测试目录是否存在
-f:测试是否是文件
-d:测试是否是目录
-L:测试是否是符号链接文件
-S:测试是否是socket文件
-b:测试是否是块设备文件
-r:测试当前用户是否有读权限
-w:测试当前用户是否有写权限
-x:测试当前用户是否有执行权限
字符串比较
=:内容相同
!=:内容不同
-z:内容为空
整数比较
-eq:等于
-ne:不等于
-gt:大于
-lt:小于
-le:大于或等于
-ge:小于或等于
逻辑比较
-a:于(and)
-o:或(or)

[root@desktop shell]# vim file_check.sh
#!/bin/bash                                            ##指定脚本解释器
[ -z "$1" ] && {                                       ##-z判断$1(命令后所跟第一串字符)是否为空,如果是则
    echo "Please input a file name after script!!"     ##则显示提示信息
    exit 1                                             ##关闭脚本
}
[ -e "$1" ] || {                                       ##-e判断文件是否存在,如果不存在则
    echo "$1 is not exist !!"                          ##显示提示信息
    exit 0                                             ##关闭脚本
}
[ -f "$1" ] && {                                       ##-f判断是否为文件,如果是则
    echo "$1 is a file"                                ##显示提示信息
    exit 0
}
[ -L "$1" ] && {                                       ##-L判断是否为链接文件,如果是则
    echo "$1 is a link file"                           ##显示提示信息
    exit 0
}
[ -b "$1" ] && {
    echo "$1 is a block device"
    exit 0
}
[ -d "$1" ] && {
    echo "$1 is a directory"
    exit 0
}

[root@desktop shell]# chmod +x file_check.sh 
[root@desktop shell]# ./file_check.sh /etc
/etc is a directory
[root@desktop shell]# ./file_check.sh /etc/passwd
/etc/passwd is a file
[root@desktop shell]# ./file_check.sh /bin
/bin is a link file
[root@desktop shell]# ./file_check.sh /dev/vdb
/dev/vdb is a block device

cut命令

cut命令一般用于字符截取
-d:指定分隔符
-f:指定截取的列
-c:指定截取字符的位置
[root@desktop shell]# vim user_show.sh
#!/bin/bash
cat /etc/passwd | grep /bin/bash | cut -d : -f 1
[root@desktop shell]# sh user_show.sh 
root
student
test
####显示/etc/passwd文件内容,使用grep过滤包含/bin/bash的行,再通过cut检索后输出,显示使用/bin/bash可登陆的用户

sort命令

sort一般用于排序
-n:数字排序
-r:倒序
-u:去掉重复的数字
-t:指定分隔符
-k:指定要排序的列
-o:输出到指定文件
[root@desktop shell]# cat /etc/passwd | sort -t : -k 3 -nr
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
test:x:1001:1001::/home/test:/bin/bash
student:x:1000:1000:Student User:/home/student:/bin/bash
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin
libstoragemgmt:x:996:994:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
unbound:x:995:993:Unbound DNS resolver:/etc/unbound:/sbin/nologin
…………………………………………………………………………………………………………………………………………………………………………………………………………………………

uniq命令

uniq命令用于对重复的字符做处理
-u:显示唯一的行
-d:显示重复的行
-c:每行显示一次并统计重复次数

猜你喜欢

转载自blog.csdn.net/xin1889/article/details/80714699