Shell

echo 输出命令

    语法:echo [选项] [输出内容]

    选项:-e  支持反斜线控制的字符转换

控制字符作用
\\输出\本身
\a输出警告音
\b退格键,也就是向左删除键
\c取消输出行末的换行符,和“-n”选项一样
\eESCAPE键
\f换页符
\n换行符
\r回车键
\t制表符,也就是tab键
\v垂直制表符
\0nnn按照八进制ASCII码表输出字符,其中0为数字零,nnn是三位八进制数
\xhh按照十六进制ASCII码表输出字符,其中hh是两位十六进制数

 

 

 

 

[root@zyf ~]# echo -e "ab\bc"
#删除左侧字符
ac
[root@zyf ~]# echo -e "a\tb\tc\nd\te\tf"
#制表符与换行符
a    b    c
d    e    f
[root@zyf ~]# echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66"
#按照十六进制ASCII码也同样可以输出
a    b    c
d    e    f
[root@zyf ~]# echo -e "\e[1;30m abcd \e[0m"
#输出颜色 
# 30m = 黑色,31m = 红色,32m = 绿色,33m = 黄色
# 34m = 蓝色,35m = 洋红,36m = 青色,37m = 白色
abcd 

2.简单脚本:

[root@zyf sh]# vi hello.sh

#!/bin/sh
#The first program
#Auther:Sirian
echo -e "I'm a superhero"

3.脚本执行:

  • 赋予文件执行权限,直接运行
  1.  chmod 775 hello.sh
  2.  ./hello.sh
  • 通过sh调用直接执行脚本(这样就可以不必赋予文件执行权限)
  1. sh hello.sh

插件:dos2unix  [脚本文件]  :将Windows的sh脚本文件转换为Linux的脚本文件

           unix2dos  [脚本文件]  :将Linux的脚本文件转换为Windows的脚本文件

Bash的基本功能:

1.  历史命令    语法: history 【选项】【历史命令保存文件】

     选项: 

            -c :     清空历史命令

            -w:      八缓存中的历史命令写入历史命令保存文件:~/bash_history

     历史命令默认会保存1000条,可以再环境变量配置文件/etc/profile中修改

 

      历史命令的调用

  1.  使用上,下箭头调用以前的历史命令
  2.  使用 "!n" 重复执行第n条历史命令
  3.  使用 "!!"  重复执行上一条命令
  4.  使用 "!字串"  重复执行最后一条以该字串开头的命令

2. 命令与文件补全

    再bash中,命令与文件补全是非常方便与常用的功能,我们只要再输入命令或者文件时,按“tab”键就会自动补全

3. 命令别名与常用快捷键

  1. 命令别名: alias 别名=‘原命令’

      查询命令别名: alisa

      命令执行时顺序:

  1.  第一顺位执行用绝对路径或相对路径执行的命令
  2.  第二顺位执行别名
  3.  第三顺位执行Bash的内部命令
  4. 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令

      让别名永久生效: vi /root/.bashrc

      删除别名: unalias

Bash 常用快捷键

快捷键作用
CTRL+A把光标移动到命令行开头,如果我们输入的命令过长,想要把光标移动到命令行开头时使用
CTRL+E把光标移动到命令行末尾
CTRL+C强制终止当前的命令
CTRL+L清屏,相当于clear命令
CTRL+U删除或剪切光标之前的命令,我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便
CTRL+K删除或剪切光标之后的内容
CTRL+Y粘贴CTRL+U或者CTRL+K 剪切的内容
CTRL+Y在历史命令中搜索,按下CTRL+R之后,就会出现搜索界面,只要输入搜索内容就会从历史命令中搜索
CTRL+D退出当前终端
CTRL+Z暂停,并放入后台,这个快捷键牵扯工作管理的内容
CTRL+S暂停屏幕输出
CTRL+Q恢复屏幕输出

 

 

 

 

 

 

 

 

 

 

 

 

 

标准输入输出

设备设备文件名文件描述符类型
键盘/dev/stdin0标准输入
显示器/dev/sdtout1标准输出
显示器/dev/sdterr2标准错误输出

输出重定向

类型符号作用
标准输出重定向命令 > 文件以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中
 命令 >> 文件以追加的方式,把命令的正确输出输出到指定的文件或设备当中
标准错误输出重定向错误命令 2> 文件以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中
 错误命令 2>>文件以追加的方式,把命令的错误输出输出到指定的文件或设备当中
正确输出和错误输出同时保存命令 > 文件 2>&1以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
 命令 >> 文件 2>&1以追加的方式,把正确输出和错误输出都保存到同一个文件当中
 命令 &> 文件以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
 命令 &>> 文件以追加的方式,把正确输出和错误输出都保存到同一个文件当中
 命令 >> 文件1 2>>文件2把正确的输出追加到文件1,把错误的输出追加到文件2中

输入重定向

语法:wc 【选项】 【文件名】

选项:

     -c:    统计字节数

    -w:    统计单词数

     -l:  统计行数

命令<文件: 把文件作为命令的输入

多命令顺序执行:

多命令执行符格式作用
命令1;名2;命令n多个命令顺序执行,命令之间没有任何逻辑关系
&&命令1 && 命令2 && 命令n

逻辑与

当命令1正确执行,则命令2才执行

当命令2执行不正确,则命令2不执行

||命令1 || 命令2 || 命令n

逻辑或

当命令1正确执行,则命令2 不执行

当命令2执行不正确,则命令2执行

 

 

 

 

 

 

 

dd命令:dd if=输入文件 of=输出文件 bs=字节数 count=个数

选项:

    if=输入文件      指定源文件或源设备

    of=输出文件     指定目标文件或者目标设备

    bs=字节数        指定一次输入/输出多少字节,即把这些字节看作一个数据块

    count=个数       指定输入/输出多少个数据块

 

管道符:命令1 | 命令2

作用: 命令1的正确输出作为命令2的操作对象

 

grep 【选项】 “搜索内容”

选项:

    -i:                            忽略大小写

    -n:                           输出行号

    -v:                           反向查找

    --color=auto               搜索出的关键字用颜色显示

通配符

通配符作用
匹配一个任意字符
*匹配0个或多个个字符,也就是可以匹配任何内容
[]匹配中括号中任意一个字符,例如[abc]代表匹配a,b,c三个字符其中一个字符只能是a,或者是b,或者是c
[-]匹配中括号中任意一个字符,-代表一个范围:例如[a-z],代表匹配任意一个小写字母
[^]逻辑非,表示匹配不是中括号内的一个字符,例如[^0-9],代表匹配一个不是数字的字符

Bash中其他的特殊符号

符号作用
''单引号,在单引号中所有的特殊符号都没有特殊含义(包括“$”和“`”)
""双引号,在双引号中特殊符号都没有特殊含义,但是“$”,"`","\"例外,拥有“调用变量的值”,“引用命令”,“转义符”的特殊含义
··反引号,反引号括起来的内容是系统命令,在Bash中会先执行它,和$()作用一样,不过推荐使用$(),因为反引号非常容易看错
$()和反引号作用一样,用来引用系统命令
#在shell脚本中,#开头的行代表注释
用于调用变量的值,如需要调用变量name的值时,需要用$name的方式来得到变量的值
\转义符,跟着\之后的特殊符号将失去特殊含义,变为普通字符,如\$将输出$符号,而不当作时变量引用

变量:   变量是计算机内存的单元,其中存放的值可以改变,当shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中,每个变量有一个名字,所有很容易引用它,使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息

变量设置规则:

       1. 变量名称可以由字母,数字和下划线组成,但是不能以数字开头

       2. 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值类型

       3.变量用等号连接值,等号左右两侧不能有空格

       4.变量的值如果有空格,需要使用单引号或双引号括起来

       5.在变量的值中,可以使用"\"转义符

       6.如果需要增加变量的值,那么可以进行变量值的叠加,不过变量需要用双引号包含“$变量名”或用${变量名}包含 

       7.如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令

       8.环境变量名建议大写,便于区分

变量分类:

       1. 用户自定义变量

       2. 环境变量:这种变量中主要保存的是和系统操作环境相关的数据

       3. 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的

       4. 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

  本地变量(用户自定义变量):

[root@zyf sh]# aa=123
[root@zyf sh]# aa="$aa"456
[root@zyf sh]# echo $aa
123456
[root@zyf sh]# aa=${aa}789
[root@zyf sh]# echo $aa
123456789
[root@zyf sh]#
#查看变量 :set 
#删除变量 :unset 变量名

    环境变量:用户自定义变量只在当前shell中生效,而环境变量会在当前shell和这个shell所有子shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效  

    设置环境变量:export 变量名=变量值

    查询变量:env

    删除变量:unset 变量名

    系统常见环境变量:

      PATH:系统查找命令的路径

      PATH="$PATH":/root/sh : PATH变量叠加(临时生效,需要保存进相关的文件才能永久生效)    

      PS1:定义系统提示符的变量

\d显示日期,格式为“星期 月 日”
\h显示简写主机名。如默认主机名“localhost”
\t

显示24小时制时间,格式为“HH:MM:SS”

\T显示12小时制时间,格式为“HH:MM:SS”
\A显示24小时制时间,格式为“HH:MM”
\u显示当前用户名
\w显示当前所在目录的完整名称
\W显示当前所在目录的最后一个目录
\#指定的第几个命令
\$提示符。如果是root用户会显示提示符为“#”,如果是普通瀛湖为显示提示符为“$”

位置参数变量:

位置参数变量作用
$nn为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
$*这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$#这个变量代表命令行中所有参数的个数
[root@zyf sh]# vi canshu1.sh
#!/bin/sh
echo $0
echo $1
echo $2
echo $3
[root@zyf sh]# chmod 755 canshu1.sh 
[root@zyf sh]# ./canshu1.sh 
./canshu1.sh
[root@zyf sh]# ./canshu1.sh 11 22 33
./canshu1.sh
11
22
33
[root@zyf sh]# cat canshu1.sh 
#!/bin/sh
echo $0
echo $1
echo $2
echo $3
[root@zyf sh]# ./canshu1.sh 11 22 33 44
./canshu1.sh
11
22
33
[root@zyf sh]# vi canshu2.sh
#!/bin/sh
sum=$(($1+$2))
echo $sum
[root@zyf sh]# chmod 775 canshu2.sh 
[root@zyf sh]# ./canshu2.sh 11 22
33

例子:*$与$@区别

[root@zyf sh]# vi canshu3.sh
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
    do
        echo "The parameters is:$*"
    done
x=1
for y in "$@"
#$@中每个参数都看成是独立的,所以“$@” 中有几个参数,就会循环几次
    do
        echo "The parameters$x is:$y"
        x=$(($x +1))
    done
[root@zyf sh]# chmod 755 canshu3.sh 
[root@zyf sh]# ./canshu3.sh 1 2 3 4
The parameters is:1 2 3 4
The parameters1 is:1
The parameters2 is:2
The parameters3 is:3
The parameters4 is:4

 预定义变量

预定义变量作用
$?最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,有命令自己决定),则证明上一条命令执行不正确
$$当前进程的进程号(PID)
$!后台运行的最后一个进程的进程号(PID)

例子:

[root@zyf sh]# vi canshu4.sh
#!/bin/sh
echo "The current process is $$"
#输出当前进程的PID
#这个PID就是variable.sh这个脚本执行时,生成的进程的PID
find /root -name hello.sh &
#使用find命令在root目录下查找hello.sh文件
#符号&的意思是把命令放入后台执行
echo "The last one Daemon process $!"
[root@zyf sh]# chmod 755 canshu4.sh 
[root@zyf sh]# ./canshu4.sh 
The current process is 40514
The last one Daenon process is 40515
[root@zyf sh]# /root/.local/share/Trash/files/hello.sh

接收键盘输入: read 【选项】【变量名】

选项:

    -p “提示信息”:  在等待read输入时,输出提示信息

    -t 秒数:              read命令会一直等待用户输入,使用此选项可以指定等待时间

    -n 字符数:          read命令只接受指定的字符数,就会执行

    -s:                      隐藏输入的数据,适用于机密信息的输入

例如:

[root@zyf sh]# vim canshu5.sh
#!/bin/sh
read -t 30 -p "Please input your name: " name
#提示“请输入行命” 并等待30秒,把用户的输入保存到变量name中
echo "Name is $name "
read -s -t 30 -p "Please enter your age: " age
#年龄时隐私,所以我们用“-s” 选项来隐藏输入
echo -e "\n"
echo "Age is $age "
read -n 1 -t 30 -p "Please select your gender[M/F]: " gender
#使用 “-n 1” 选项只接收一个输入字符就会执行(都不用输入回车)
echo -e "\n"
echo "Sex is $gender" 
[root@zyf sh]# chmod 755 canshu5.sh 
[root@zyf sh]# ./canshu5.sh 
Please input your name: zz
Name is zz 
Please enter your age: 

Age is 18
Please select your gender[M/F]: M

Sex is M
[root@zyf sh]# 


Bash 运算符

  1. declare:声明变量类型

    语法:declare [+/-] [选项] 变量名

    选项:

      -: 给变量设定类型属性

     +: 取消变量的类型属性

     -i: 将变量声明为整数型(integer)

    -x: 将变量声明为环境变量

    -p: 显示指定变量的被声明的类型

 

  数值运算与运算符

    第一种数值运算方式

[root@zyf sh]# aa=11
[root@zyf sh]# declare -p aa
declare -- aa="11"
[root@zyf sh]# export aa
[root@zyf sh]# declare -p aa
declare -x aa="11"
[root@zyf sh]# bb=22
[root@zyf sh]# cc=$aa+$bb
[root@zyf sh]# echo $cc
11+22
[root@zyf sh]# declare -i cc=$aa+$bb
[root@zyf sh]# echo $cc
33
[root@zyf sh]# 

    第二种数值运算方式: expr 

[root@zyf sh]# aa=11
[root@zyf sh]# bb=22
[root@zyf sh]# cc=$(expr $aa + $bb)
#dd的值是aa和bb的和,注意"+"号左右两侧必须有空格
[root@zyf sh]# echo $cc
33
[root@zyf sh]# 

    第三种数值运算方式: "$((运算式))"或 "$[运算式]"

[root@zyf sh]# aa=11
[root@zyf sh]# bb=22
[root@zyf sh]# cc=$(($aa + $bb))
[root@zyf sh]# dd=$[$aa+$bb]
[root@zyf sh]# echo $cc
33
[root@zyf sh]# echo $dd
33
[root@zyf sh]# 

    运算符:  优先级越高,越先执行

优先级运算符说明
13-.+单目负,单目正
12!,~

逻辑非,按位取反或补码

11*./,%乘,除,取模
10+,-加减
9<<,>>按位左移,按位右移
8<=,>=,<,>小于等于,大于等于,小于,大于
7==,!=等于,不等于
6&按位与
5^按位异或
4|按位或
3&&逻辑非
2||逻辑或
1=,+=,-,=,*=,/=,%=,&=,^=,|=,<<=.>>=赋值,运算且赋值

 

 

 

 

 

 

 

 

 

 

 

 

 

例子:

[root@zyf sh]# aa=$(((11+3)*3/2))
#虽然乘除的优先级高于加,但是通过小括号可以调整运算优先级
[root@zyf sh]# echo $aa
21[root@zyf sh]# bb=$((11+3*3/2))
[root@zyf sh]# echo $bb
15
[root@zyf sh]# cc=$((14%3))
#14不能被3整除,余数为2
[root@zyf sh]# echo $cc
2
[root@zyf sh]# dd=$((1&&0))
#逻辑与运算只有两边都是1,与的结果才是1,否在与的结果是0
[root@zyf sh]# echo $dd
0
[root@zyf sh]# 

变量测试与内容替换:

变量置换方式变量y没有设置变量y为空值变量y设置值
x=${y-新值}x=新值x为空x=$y
x=${y:-新值}x=新值x=新值x=$y
x=${y+新值}x为空x=新值x=新值
x=${y:+新值}x为空x为空x=新值
x=${y=新值}

x=新值

y=新值

x为空

y值不变

x=$y

y值不变

x=${y:=新值}

x=新值

y=新值

x=新值

y=新值

x=$y

y值不变

x=${y?新值}新值输出到标准错误输出(就是屏幕)x为空x=$y
x=${y:?新值}新值输出到标准错误输出新值输出到标准错误输出x=$y

 

 

 

 

 

 

 

 

 

例子:

[root@zyf sh]# unset a
#删除变量a
[root@zyf sh]# x=${a-new}
#测试x=${y-新值}
[root@zyf sh]# echo $x
#因为变量a不存在,所以x=new
new
[root@zyf sh]# a=123
#声明变量a并赋值
[root@zyf sh]# x=${a-new}
[root@zyf sh]# echo $x
#因为变量a有值,所以x=a的值
123
[root@zyf sh]# a=""
[root@zyf sh]# x=${a-new}
[root@zyf sh]# echo $x
#因为变量a为空,所以x也为空

[root@zyf sh]#

 

环境变量配置文件

  环境变量配置文件简介:

    1. source 命令:  语法: source  配置文件(. 配置文件): 强制更行配置文件使其重新加载生效,就不需要重启电脑了

    环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH,HISTSIZE,PS1,HOSTNAME等默认环境变量

  主要配置文件:

  1.     /etc/profile
  2.     /etc/profile.d/*.sh  
  3.     ~/.bash_profile
  4.     ~/.bashrc
  5.     /etc/bashrc

  注意:  只要是在etc下面的shell文件是对所有登录的用户都生效的 

            ~/是home目录,所以如果是root用户登录会读取root用户的家目录,但是当其他用户去登录的时候就不会去读取这个文件,那也就是.bash_profile和bashrc文件只对当前用户生效,哪个用户修改了对应文件就只对哪个用户生效,而且这两个文件是隐藏文件,所以用.开头

  环境变量配置文件作用

    

  1. /etc/profile的作用

  • USER变量:                             当前用户名
  • LOGNAME变量:                    登录用户名
  • MAIL变量:                              当前用户邮箱
  • PATH变量:                             环境变量
  • HOSTNAME变量:                  历史命令
  • HISTSIZE变量:                      默认历史命令条数    
  • umask:                                  系统默认权限(root用户是002)
  • 调用/etc/profile.d/*.sh文件    主要功能是定义当前用户的使用语言,和默认编码集

   2. ~/.bash_profile的作用

  •     调用了~/.bashrc文件
  •     再PATH变量后面加入了":$HOME/bin" 这个目录

   3. ~/.bashrc的作用

  •     定义了系统别名
  •     调用了/etc/bashrc文件

   4. /etc/bashrc的作用

  •     PS1变量 :                              提示符 
  •     umask:                                 默认权限
  •     PATH变量:                            环境变量   
  •     调用/etc/profile.d/*.sh文件

  注意: 重新定义的umask,PAHT和调用的文件主要是针对不需要用户密码切换的用户的配置

其他配置文件和登录信息

1. 注销时生效的环境变量配置文件

~/.bash_logout:  该文件默认是空的,如果每次登录想要清空历史命令啊,清空环境变量之类的一些命令就可以写在该文件中,写完之后每次注销登录的时候就会把这些命令执行一次

2. 其他配置文件

~/bash_history: 历史命令保存文件

3. Shell登录信息

本地终端欢迎信息: /etc/issue

转义符作用
\d显示当前系统日期
\s显示操作系统名称
\l显示登录的终端号,这个比较常用
\m显示硬件体系结构,如i386,i686等
\n显示主机名
\o显示域名
\r显示内核版本
\t显示当前系统时间
\u显示当前登录用户的序列号 

远程终端欢迎信息: /etc/issue.net

  • 转义符在/etc/issue.net文件中不能使用
  • 是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入" Banner /etc/issue/net"行才能显示(记得重启ssh服务service sshd restart)

登录后欢迎信息: /etc/motd

  不管是本地登录还是远程登录都可以显示此欢迎信息

 

正则表达式

1. 基础正则表达式

1.正则表示式与通配符

  • 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep,awk,sed等命令可以支持正则表达式
  • 通配符用来匹配符合条件的文件名,通配符是完全匹配,ls,find,cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了

2. 基础正则表达式

元字符作用
*前一个字符匹配0次或任意次
.匹配除了换行符外任意一个字符
^匹配行首,例如^hello会匹配以hello开头的行
$匹配行尾,例如hello$会匹配以hello结尾的行
[]

匹配中括号中指定的任意一个字符,只匹配一个字符

例如:[aoeiu]匹配任意一个元音字母,[0-9]普配任意一个数字,[a-z][0-9]匹配小写字母和一个数字构成的两个字符

[^]匹配除中括号的字符意外的任意一个字符,例如[^0-9]匹配任意以为非数字的字符,[^a-z]匹配任意以为非小写字母的字符
\转义符,用于取消特殊符号的含义
\{n\}表示其前面的字符恰好出现n次,例如:[0-9]\{4\}匹配4位数字,[1][3-8][0-9]\{9\}匹配手机号码
\{n,\}表示其前面的字符出现不小于n次,例如[0-9]\{2,\}表示两位及以上的数字
\{n,m\}表示其前面的字符至少出现n次,最多出现m次,例如[z-a]\{6,8\}匹配6到8位的小写字母

grep: 在文件中提取符合条件的行

测试文件:

 

Your eyes are any hint of warm not for me.
To look back, and saw one no longer young, never make public does not rise.

As long as no death simply Fortunately
One person you loved is not love
Love you more than myself
North of the city to the north is not to miss

Youth is not a time of life, it is a state of mind

Do not let dream just be your dream
The man who has made up his mind to win will never say “impossible”.——baiBonapart Napoleon
If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds

测试: "*" 前一个字符匹配0次或任意多次

#匹配所有内容,包括空白行
[root@localhost test]# grep "a*" test1 
Your eyes are any hint of warm not for me.
To look back, and saw one no longer young, never make public does not rise.

As long as no death simply Fortunately
One person you loved is not love
Love you more than myself
North of the city to the north is not to miss

Youth is not a time of life, it is a state of mind

Do not let dream just be your dream
The man who has made up his mind to win will never say “impossible”.——baiBonapart Napoleon
If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds

#匹配至少包含有一个a的行
[root@localhost test]# grep "aa*" test1 
Your eyes are any hint of warm not for me.
To look back, and saw one no longer young, never make public does not rise.
As long as no death simply Fortunately
Love you more than myself
Youth is not a time of life, it is a state of mind
Do not let dream just be your dream
The man who has made up his mind to win will never say “impossible”.——baiBonapart Napoleon
If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds
[root@localhost test]# 

测试: "." 匹配除了换行符外任意一个字符

#匹配在y和u这两个字母之间一定有一个字符的单词
[root@localhost test]# grep "y.u" test1 
To look back, and saw one no longer young, never make public does not rise.
One person you loved is not love
Love you more than myself
Do not let dream just be your dream
If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds
#匹配在y和u字母之间有任意字符
[root@localhost test]# grep "y.*u" test1 
To look back, and saw one no longer young, never make public does not rise.
As long as no death simply Fortunately
One person you loved is not love
Love you more than myself
Do not let dream just be your dream
If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds
[root@localhost test]# 

测试: "^" 匹配行首,"$" 匹配行尾

#匹配以大写字母Y开头的行
[root@localhost test]# grep "^Y" test1 
Your eyes are any hint of warm not for me.
Youth is not a time of life, it is a state of mind
#匹配以小写字母y结尾的行
[root@localhost test]# grep "y$" test1 
As long as no death simply Fortunately
#匹配空白行
[root@localhost test]# grep "^$" test1 



[root@localhost test]#

测试: "[]" 匹配中括号中指定的任意一个字符

#匹配y和u中要不是o,s,e,g,u的字母
[root@localhost test]# grep "y[osegw]u" test1 
To look back, and saw one no longer young, never make public does not rise.
One person you loved is not love
Love you more than myself
Do not let dream just be your dream
If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds
[root@localhost test]# 

测试: "\" 转义符

#匹配以.结尾的行
[root@localhost test]# grep "\.$" test1 
Your eyes are any hint of warm not for me.
To look back, and saw one no longer young, never make public does not rise.
[root@localhost test]# 

测试: "\{n\}" 表示前面的字符出现n次

#匹配字母o出现2次的字符串
[root@localhost test]# grep "o\{2\}" test1 
To look back, and saw one no longer young, never make public does not rise.
[root@localhost test]#

测试: "\{n,m\}" 表示前面的字符最少出现n次,最多出现m次

#匹配字母o最少出现1次或2次的字符串
[root@localhost test]# grep "o\{1,2\}" test1 
Your eyes are any hint of warm not for me.
To look back, and saw one no longer young, never make public does not rise.
As long as no death simply Fortunately
One person you loved is not love
Love you more than myself
North of the city to the north is not to miss
Youth is not a time of life, it is a state of mind
Do not let dream just be your dream
The man who has made up his mind to win will never say “impossible”.——baiBonapart Napoleon
If you have great talents, industry will improve them;if you have but moderate abilities, industry will supply their deficiency.  ——Joshuas Reynolds
[root@localhost test]# 

 

2. 字符截取命令

1. cut 字段提取命令 :

  语法:   cut [选项] 文件名

  选项:   -f  列号:       提取第几列

             -d 分隔符:    按照指定分隔符分割列

测试文件:

[root@localhost test]# vim test2
ID    Name    Gender   Mark
1     Lilin   W        99
2     Xiaoxi  M        88
3     Ganyu   W        77

测试: cut

#提取第二列
[root@localhost test]# cut -f 2 test2
Name
Lilin
Xiaoxi
Ganyu
#提取第二列和第三列
[root@localhost test]# cut -f 2,3 test2
Name	Gender
Lilin	W
Xiaoxi	M
Ganyu	M
[root@localhost test]# 

注意: cut命令的缺陷,不能space来分列,只能识别tab制表符或具体的分割符号

 

2. printf命令: 格式化输出命令

  语法: printf '输出类型输出格式' 输出内容

  输出类型: 

    %ns:           输出字符串,n是数字指代输出几个字符

    %ni:            输出整数,n是数值指代输出几个数字

    %m.nf:        输出浮点数,m和n是数字,指代输出的整数位数和小数位数,如%8.2f代表共输出8位数,其中2位是小数,6位是整数

  输出格式:

    \a:               输出警告声音

    \b:               输出退格键,也就是Backspace键

    \f:                清除屏幕

    \n:               换行

    \r:                回车,也就是Enter键

    \t:                水平输出退格键,也就是Tab键

    \v:               垂直输出退格键,也就是Tab键

测试:

[root@localhost test]# printf %s 1 2 3 4 5 6
#输出字符串123456
123456[root@localhost test]# printf %s %s %s 1 2 3 4 5 6
#想输出1 2 3 三个字符串为一组,结果printf把从第二个%s开始后面的内容都当成了一个字符串输出了
%s%s123456[root@localhost test]# printf '%s %s %s' 1 2 3 4 5 6
#输出字符串3个字符串为一组输出,但是两组字符串没有换行符
1 2 34 5 6[root@localhost test]# printf '%s %s %s\n' 1 2 3 4 5 6
#输出字符串3个字符串为一组并换行输出
1 2 3
4 5 6
[root@localhost test]# vim student.txt
ID	 Name	 PHP	 Linux	 MySQL	 Average
1	 Lilin	 88	 99	 77	 66
2	 Ganyu	 67	 78	 89	 90
3	 Yungang 66	 77	 88	 99
[root@localhost test]# printf '%s\t %s\t %s\t %s\t %s\t %s\n' $(cat student.txt) 
ID	 Name	 PHP	 Linux	 MySQL	 Average
1	 Lilin	 88	 99	 77	 66
2	 Ganyu	 67	 78	 89	 90
3	 Yungang	 66	 77	 88	 99
[root@localhost test]# 

  在awk命令的输出中支持print和printf命令

  •   print:   print会在每个输出之后自动加入一个换行符(Linux默认没有print命令)
  •   printf:  printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符

 

3. awk命令

  语法:         awk '条件1{动作1} 条件2{动作2} .......' 文件名

    条件(Pattern):

      一般使用关系表达式作为条件

      x > 10          判断变量x是否大于10

      x >= 10        大于等于

      x <= 10        小于等于

    动作(Action):

      格式化输出

      流程控制语句

  测试:

[root@localhost test]# awk '{printf $2 "\t" $6 "\n" }' student.txt
Name	Average
Lilin	66
Ganyu	90
Yungang	99
#获取sda1的根分区占用率
[root@localhost test]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 894M     0  894M   0% /dev
tmpfs                    910M     0  910M   0% /dev/shm
tmpfs                    910M   11M  900M   2% /run
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/mapper/centos-root   17G   14G  3.9G  78% /
/dev/sda1               1014M  185M  830M  19% /boot
tmpfs                    182M   36K  182M   1% /run/user/0
/dev/sr0                 4.5G  4.5G     0 100% /run/media/root/CentOS 7 x86_64
[root@localhost test]# df -h | grep sda1
/dev/sda1               1014M  185M  830M  19% /boot
[root@localhost test]# df -h | grep sda1 | awk '{print $5}'
19%
[root@localhost test]# df -h | grep sda1 | awk '{print $5}' | cut -d "%" -f1
19
[root@localhost test]# 
#BEGIN: 在所有命令执行之前先执行该行命令
#因为awk是先读取数据在进行截取,所以第一行数据就没有进行处理
[root@localhost ~]# awk '{FS=":"}{print $1 "\t" $3}' /etc/passwd
root:x:0:0:root:/root:/bin/bash	
bin	1
daemon	2
adm	3
lp	4
sync	5
#加上BEGIN就能解决
[root@localhost ~]# awk 'BEGIN{FS=":"}{print $1 "\t" $3}' /etc/passwd
root	0
bin	1
daemon	2
adm	3
lp	4
sync	5

 

4. sed命令

    sed是一种几乎包括所有unix平台(包括Linux)的轻量级流编辑器,sed主要是用来将数据进行选取,替换,删除,新增的命令

  语法: sed [选项]-'[动作]'- 文件名

  选项:

    -n:                 一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕

    -e:                 允许对输入数据应用多条sed命令编辑,多条命令之间由;分割

    -i:                  用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

  动作:

   a \:                追加,在当前行后添加一行或多行,添加多行时,除最后一行外,每行末尾都需要用"\"代表数据未完结

   c \:                行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用"\" 代表数据未完结

   i \:                 插入,在当前行前插入一行或多行,插入多行时,除最后一行外,每行末尾需要用"\"代表数据未完结

   d:                  删除,删除指定的行

   p:                 打印,输出指定的行

   s:                 字串替换,用一个字符串替换另外一个字符串,格式为"行范围s/旧字串/新字串/g"(和vim中的替换格式类似)

测试:

[root@localhost ~]# sed '2p' student.txt 
ID	 Name	 PHP	 Linux	 MySQL	 Average
1	 Lilin	 88	 99	 77	 66
1	 Lilin	 88	 99	 77	 66
2	 Ganyu	 67	 78	 89	 90
3	 Yungang 66	 77	 88	 99
[root@localhost ~]# sed -n '2p' student.txt 
1	 Lilin	 88	 99	 77	 66
[root@localhost ~]# df -h | sed -n '2p'
devtmpfs        895M     0  895M   0% /dev
[root@localhost ~]# sed '2,4d' student.txt 
ID	 Name	 PHP	 Linux	 MySQL	 Average
[root@localhost ~]# sed '2,3d' student.txt 
ID	 Name	 PHP	 Linux	 MySQL	 Average
3	 Yungang 66	 77	 88	 99
[root@localhost ~]# cat student.txt 
ID	 Name	 PHP	 Linux	 MySQL	 Average
1	 Lilin	 88	 99	 77	 66
2	 Ganyu	 67	 78	 89	 90
3	 Yungang 66	 77	 88	 99
[root@localhost ~]# sed '2a zuobi' student.txt 
ID	 Name	 PHP	 Linux	 MySQL	 Average
1	 Lilin	 88	 99	 77	 66
zuobi
2	 Ganyu	 67	 78	 89	 90
3	 Yungang 66	 77	 88	 99
[root@localhost ~]# sed '2i xixi \
dada' student.txt
ID	 Name	 PHP	 Linux	 MySQL	 Average
xixi 
dada
1	 Lilin	 88	 99	 77	 66
2	 Ganyu	 67	 78	 89	 90
3	 Yungang 66	 77	 88	 99
[root@localhost ~]# sed '4c no person' student.txt 
ID	 Name	 PHP	 Linux	 MySQL	 Average
1	 Lilin	 88	 99	 77	 66
2	 Ganyu	 67	 78	 89	 90
no person
[root@localhost ~]# sed '4s/77/55/g' student.txt 
ID	 Name	 PHP	 Linux	 MySQL	 Average
1	 Lilin	 88	 99	 77	 66
2	 Ganyu	 67	 78	 89	 90
3	 Yungang 66	 55	 88	 99
[root@localhost ~]#


 

3. 字符处理命令

1. 排序命令sort : 

  语法:                      sort [选项] 文件名

  选项:

    -f:                         忽略大小写

    -n:                        以数值型进行排序,默认使用字符串型排序

    -r:                         反向排序

    -t:                         指定分隔符,默认分隔符时制表符

    -k n[,m]:               按照指定的字段范围排序,从第n字段开始,m字段结束(默认到行尾)

 

2. 统计命令wc: 

    语法:                   wc [选项] 文件名

    选项:

    -l:                        只统计行数

    -w:                      只统计单词数

    -m:                     只统计字符数

测试:

[root@localhost ~]# wc /etc/passwd
  46   93 2431 /etc/passwd
[root@localhost ~]# wc -l /etc/passwd
46 /etc/passwd
[root@localhost ~]# 

 

4. 条件判断

1. 按照文件类型进行判断

测试选项作用
-b 文件判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d 文件判断该文件是否存在,并且是否为目录文件(是目录文件为真)
-e 文件判断该文件是否存在(存在为真)
-f 文件判断该文件是否存在,并且是否为普通文件(是普通文件为真)
-L 文件判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
-p 文件判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件判断该文件是否存在,并且是否为非空(非空为真)
-S 文件判断该文件是否存在,并且是否为套接文件(是套接文件为真)

 

 

 

 

 

 

 

 

 

测试:
 

#判断是否是否存在
[root@localhost ~]# test -e student.txt 
#判断上一条命令执行是否正确,正确返回0,不正确返回其他数值
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -e student.txtsss
[root@localhost ~]# echo $?
1
#判断是否是否存在
[root@localhost ~]# [ -e student.txt ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -e student.txtss ]
[root@localhost ~]# echo $?
1
#判断student.txt是否存在,并且是目录,是则输出 yes,不是则输出no
[root@localhost ~]# [ -d student.txt ] && echo 'yes' || echo 'no'
no

 

2. 按照文件权限进行判断

测试选项作用
-r 文件判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w 文件判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
-x 文件判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
-u 文件判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)
-g 文件判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)
-k 文件判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)

 

 

 

 

 

 

 

3. 两个文件之间进行比较

测试选项作用
文件1 -nt 文件2判断文件1的修改时间是否比文件2的新(如果新则为真)
文件1 -ot 文件2判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件1 -ef 文件2 判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件,这个判断用于判断硬链接是很好的方法

测试:

[root@localhost ~]# ln /root/student.txt /tmp/stu.txt
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# ll
total 80
drwxr-xr-x. 2 root root    32 Jun 29 15:07 hsperfdata_root
drwx------  2 root root    24 Aug 12 15:32 ssh-hfV0RNAlbUB3
-rw-r--r--  2 root root   113 Aug 12 15:35 stu.txt
drwx------  3 root root    17 Aug 12 15:29 systemd-private-84b1b895fd3e4659a6751b2a2187561a-bolt.service-GbstGq
drwx------  3 root root    17 Aug 12 15:30 systemd-private-84b1b895fd3e4659a6751b2a2187561a-colord.service-H0aumN
drwx------  3 root root    17 Aug 12 15:27 systemd-private-84b1b895fd3e4659a6751b2a2187561a-cups.service-A0jw9z
drwx------  3 root root    17 Aug 12 15:32 systemd-private-84b1b895fd3e4659a6751b2a2187561a-fwupd.service-hY312B
drwx------  3 root root    17 Aug 12 15:27 systemd-private-84b1b895fd3e4659a6751b2a2187561a-rtkit-daemon.service-sf9wMd
drwx------. 2 root root     6 Aug 12 15:35 tracker-extract-files.0
drwx------  2 root root     6 Aug 12 15:27 vmware-root_599-4022243158
-rw-------  1 root root 76622 Aug 11 09:24 yum_save_tx.2020-08-11.09-24.j2Vbor.yumtx
[root@localhost tmp]# [ /root/student.txt -ef /tmp/stu.txt ] && echo 'yes' || echo 'no'
yes
[root@localhost tmp]# 

4. 两个整数之间比较

测试选项作用
整数1 -eq 整数2判断整数1是否和整数2相等(相等为真)
整数1 -ne 整数2 判断整数1和整数2不相等(不相等为真)
整数1 -gt 整数2判断整数1是否大于整数2(大于为真)
整数1 -lt 整数2 判断整数1是否小于整数2(小于为真)
整数1 -ge 整数2判断整数1是否大于等于整数2(大于等于为真)
整数1 -le  整数2判断整数1是否小于等于整数2(小于等于为真)

 

5. 字符串的判断

测试选项作用
-z 字符串判断字符串是否为空(为空反返回真)
-n 字符串判断字符串是否为非空(非空返回真)
字串1 == 字串2判断字符串1是否和字符串2相等(相等返回真)
字串1 != 字串2判断字符串1是否和字符串2不相等(不相等返回真)

6. 多重条件判断

测试选项作用
判断1 -a 判断2逻辑与,判断1和判断2都成立,最终结果为真
判断1 -o 判断2逻辑或,判断1和判断2有一个成立,最终结果为真
! 判断逻辑非,是原始的判断取反

 

5. 流程控制

1. if语句

1.1 单分支if条件语句

语法:  if [ 条件判断式 ]:then

                程序

          fi

          或者

          if [ 条件判断式 ]

                then

                       程序

         fi

单分支条件语句需要注意的几个点

  • if语句使用fi结尾,和一般语言使用大括号结尾不同
  • [ 条件判断式 ] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格
  • then后面跟符合条件之后执行的程序,可以放在[]之后,用"; "分割,也可以换行写入,就不需要"; " 了

样例: 判断分区使用率

[root@localhost ~]# cat test1.sh 
#! /bin/sh
#统计根分区使用率,如果内存占用率达到80%就报警
#把根分区使用率作为变量值赋予变量rate
rate=$(df -h | grep '/dev/sda3' | awk '{print $5}' | cut -d "%" -f1)

if [ $rate -ge 80 ]; then
	echo "Warning1 /dev/sda3 is full!!"
fi

1.2 多分支if条件语句

语法: if [ 条件判断式 } 

             then

                条件成立时,执行得程序

             else

                条件不成立时,执行得另一个程序

         fi

样例: 备份MySQL数据库

[root@localhost sh]# vim test2.sh 
#! /bin/bash
#备份MySQL数据库
#同步系统时间
ntpdate asia.pool.ntp.org &>/dev/null
#把当前系统时间安装'年月日'格式赋予变量date
date=$(date +%y%m%d)
#统计MySQL数据库得大小,并把大小赋予size变量
size=$(du -sh /var/lib/mysql)
#判断临时文件dbbak是否存在
if [ -d /tmp/dbbak ]
        then
                #如果存在则将date变量输出,并写入临时文件dbinfo.txt文件中,以覆盖得方式写入
                echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
                #将备份数据大小,以追加得方式写入dbinfo.txt文件中
                echo "Date size : $size!" >> /tmp/dbbak/dbinfo.txt
                cd /tmp/dbbak
                #将 MySQL目录和临时文件打包
                # &>/dev/null 是将所有得输出内容都丢入回收站
                tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &> /de
v/null
                #删除临时文件
                rm -rf /tmp/dbbak/dbinfo.txt
        else
                # 创建临时文件目录
                mkdir /tmp/dbbak
                # 将date变量输出并写入临时文件dbinfo.txt文件中,以覆盖得方式写入
                echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
                # 将size变量输出并写入临时文件dbinfo.txt文件中,以追加方式写入
                echo "Date size : $size" >> /tmp/dbbak.dbinfo.txt
                cd /tmp/dbbak
                # 将MySQL目录和临时文件打包,以日期为名字是为了防止文件被覆盖
                tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev
/null
                #删除临时文件
                rm -rf /tmp/dbbak/dbinfo.txt
fi

样例: 判断apache是否启动

 

 

 

 

2. case语句

 

 

3. for循环

 

 

4. while循环

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值