• shell脚本


    一、Shell

    1.1 什么是Shell

    Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行交付,把用户的输入解释给操作系统,并处理各种操作系统的输出结果,最后将结果输出到屏幕反馈给用户。

    我们的语言计算机是无法识别的,机器使用的是二进制语言(例如010110),这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的语言,并将计算机生成的结果返回。这个时候就出现了编程语言。
    在这里插入图片描述


    1.2 编程语言

    1.2.1 低级语言

    机器语言: 就是二进制语言
    汇编语言: 符号语言,使用助记符来代替操作码,也就是用符号代替机器语言的二进制码


    1.2.2 高级语言

    编程语言:

    是一种接近人类的语言,实现人们能够用容易理解的方式,进行编写程序
    
    • 1

    分为两种编程语言:
    编译型语言 如:c 、 c++ 、 go、java
    解释型语言 如: php、shell 、python、perl


    1.2.3 编译器

    编译器就是将高级语言翻译为低级语言的程序。
    
    • 1

    例如:gcc、pycharm、deveco


    1.3 什么是Shell脚本

    在一个文件中,将系统的命令以及相关的语法语句组合,比如变量,流程控制语句等,然后通过这个文件去执行时,我们就说这个程序为shell脚本或shell程序。也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,


    二、shell基础

    2.1 shell文件的格式

    1、使用#!/bin/bash开头
    告诉脚本文件使用的哪种命令解释器。如果不指定shell,以当前shell作为执行的shell。

    2、在shell中以#号开头的,整行变为注释。执行时被忽略

    3、shell程序的文件后缀为.sh

    4、运行shell脚本,需要执行权限x,可以用chmod +x来指定

    例如:

    vim test.sh		# .sh后缀
    
    #!/bin/bash
    # this is a shell file			# 注释不显示
    echo "hello,world!"	#echo输出值
    
    chmod +x test.sh	#赋予shell文件执行的权限
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.2 创建shell脚本

    1、创建shell文件,为.sh后缀的文件

    2、进入文件编辑,检测语法错误

    3、修改文件的权限,使其可以执行,可以使用命令chmod +x file_name.sh

    4、使用命令执行./fie_name.sh


    2.3 shell执行方式

    1、直接输入绝对路径./file_name.sh (当前路径下执行脚本得有执行权限)

    2、source file_name.sh (可以无执行权限)

    3、bash file_name.shsh file_name.sh (不添加执行权限可以运行,bash开启新的会话)

    4、sh < file_name.shcat test.sh | sh/bash


    三、 shell变量

    变量是shell传递数据的一种方式,变量是用来代表每个值的标识符。

    3.1 变量的设置使用规则

    1、 变量名数字字母(大小写)和下划线_组成。
    变量名区分大小写;变量名不能以数字开头

    2、定义变量时=两边不能有空格

    var1=123
    
    • 1

    3、 变量的数据类型为整数型字符型

    4、 如果配置变量为字符型,建议用引号将其括起来。如果变量值中存在空格,需要使用单引号''或双引号""才能实现。

    var1="test"
    
    • 1

    5、 调用变量,在变量名前面加美元符号$

    echo ${var1}
    
    echo -n $var	#-n指定为不换行显示
    
    • 1
    • 2
    • 3

    6、实现嵌套变量

    var2=$(tar -cvf test.tar $(find / -name *.cnf))
    
    • 1

    7、变量值叠加

    var3=123
    echo ${var3}456.txt
    
    • 1
    • 2

    3.2 变量的分类

    1、自定义变量
    用户自己定义的变量,在单个脚本里生效,或者用于多个脚本上。

    2、环境变量
    定义在用户家目录下.bashrc.bash_profile文件中,用户私有变量,只能本用户使用。当前进程有效,并且能够被子进程调用。

    3、全局变量
    使用export命令将本地变量输出为当前shell中的环境变量,全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用。

    4、系统变量
    shell本身已经固定好了它的名字和作用,可以理解为shell命令


    3.3 定义变量

    实验环境为centos7

    语法: 变量=值

    测试:

    # 定义变量,显示变量
    var1=123
    echo $var1		
    	
    # 输出变量加括号
    echo ${var1}.txt
    
    # 测试嵌套变量
    var2=$(tar -cvf test.tar $(find /root -name *.cnf))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.4 变量符号

    / 转义符
    跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出$符号,而不当做是变量引用

    '' 单引号
    在单引号中所有的字符包括特殊字符($,'',和\)都将解释成字符本身而成为普通字符。

    "" 双引号
    在双引号中,除了($, '', 和\ ) 以外所有的字符都解释成字符本身,拥有调用变量的值引用命令转义符的特殊含义

    单引号里的内容会原封不动赋值给变量,双引号里的内容如有特殊符号会保留它的特殊含义


    3.5 取消变量

    unset 变量名
    
    • 1

    centos7环境下:

    [root@localhost ~]# var1=123
    [root@localhost ~]# echo $var1
    123
    [root@localhost ~]# unset var1
    [root@localhost ~]# echo $var1
    
    [root@localhost ~]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.6 环境变量

    环境变量分为两类:全局变量和局部变量

    3.6.1 全局变量

    全局变量对所有账号和所有的会话都是可见、可用的

    【查看全局变量】
    [root@localhost ~]# env
    XDG_SESSION_ID=1
    HOSTNAME=localhost.localdomain
    SELINUX_ROLE_REQUESTED=
    TERM=xterm
    SHELL=/bin/bash
    HISTSIZE=1000
    SSH_CLIENT=10.1.1.222 1271 22
    SELINUX_USE_CURRENT_RANGE=
    SSH_TTY=/dev/pts/0
    USER=root
    MAIL=/var/spool/mail/root
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    PWD=/root
    LANG=en_US.UTF-8
    SELINUX_LEVEL_REQUESTED=
    HISTCONTROL=ignoredups
    SHLVL=1
    HOME=/root
    LOGNAME=root
    SSH_CONNECTION=10.1.1.222 1271 10.1.1.1 22
    LESSOPEN=||/usr/bin/lesspipe.sh %s
    XDG_RUNTIME_DIR=/run/user/0
    _=/usr/bin/env
    
    #路径里面也有PATH
    [root@localhost ~]# env | grep PATH
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    
    
    【export】
    # 使用export将局部变量变成全局变量
    var1=123
    vim 2.sh
    #!/bin/bash
    echo $var1
    
    # 赋值
    export var1=123
    #再次执行就引用全局变量了
    bash 2.sh
    
    
    【export在新开的会话没有生效,因为没有永久生效,需要写到配置文件里】
    登录系统,一定会加载这4个配置文件
    /etc/profile    #系统全局环境和系统登录的一些配置,高亮显示、umask、history数量
    /etc/bashrc    #bash 全局自义配置文件,用于自定义shell
    /root/.bashrc   #用于单独自定义某个用户的bash
    /root/.bash_profile  #用户单独自定义某个用户的系统环境
    
    # 黑客的恶意代码可能会写在这些文件中
    
    【这些文件都是开机自启动的,如何测试配置文件的加载顺序】
    可以在文件里写个echo,启动时就会显示顺序
    
    【有多个一样的变量,是以哪个值为准】
    以最后一个为准
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    3.6.2 局部变量

    局部变量只在自己的进程当中使用,对当前的用户生效。

    # 创建一个shell脚本
    vim 1.sh
    #!/bin/bash
    var1=123
    echo $var1
    
    #运行脚本程序可以调用变量
    bash 1.sh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.6.3 PATH环境变量

    Lshell要执行某一个程序,需要在系统中去搜索这个程序的路径才能使用。path变量是用来定义命令和查找命令的目录,当我们安装了第三方程序后,可以把第三方程序bin目录添加到这个path路径内,就可以在全局调用这个第三方程序。

    例如:

    # 创建个脚本
    [root@localhost ~]# vim backup 
    #!/bin/bash
    echo "This is backup!"
    
    
    
    
    # 添加权限运行
    [root@localhost ~]# chmod +x back.sh 
    [root@localhost ~]# ./backup			
    This is backup!
    
    
    【要让其在群居都能运行被调用】
    # 查看PATH
    [root@localhost ~]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    
    # 配置PATH
    [root@localhost ~]# PATH=/root/:$PATH
    [root@localhost ~]# echo $PATH
    /root/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@localhost ~]# cd /opt
    [root@localhost opt]# ll
    total 0
    [root@localhost opt]# backup
    This is backup!
    
    【写入/etc/profile文件】
    vim /etc/profile
    echo PATH=/root/:$PATH
    
    #然后使用source重新加载
    source /etc/profile
    
    【/bin和/sbin的区别说明】
    
    /sbin 目录下存放系统命令,如shutdown,reboot,用于启动系统,修复系统等,一般只有管理员才可以运行
    
    /bin 目录下存放基本命令,如ls,chmod等,在Linux系统里的配置文件、脚本里常用。管理员和普通用户都可以使用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    3.6.4 位置变量

    Shell解释执行用户的命令时,将命令行的第一个字符作为命令名,而其它字符作为参数。
    $0 获取当前执行的shell脚本的文件文件名,包括脚本路径,命令本身
    $n 获取当前脚本的第n个参数 n=1,2…n 当n大于9时 用${10}表示。

    例如:

    [root@localhost ~]# vim test_2.sh
    #!/bin/bash
    a="A"
    b="B"
    echo "$a"
    echo "$b"
    echo $0
    [root@localhost ~]# ./test_2.sh
    A
    B
    ./test_2.sh
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.6.5 特殊变量

    $* 以一个单字符串显示所有向脚本传递的参数;

    如"$*"用【"】括起来的情况、以【$1 $2 … $n】的形式输出所有参数

    $# 传递到脚本的参数个数

    $$ 当前进程的进程号PID

    $? 显示最后命令的退出状态;0表示没有错误,其他任何值表明有错误

    $! 后台运行的最后一个进程的进程号pid


    3.6.6 只读变量

    只能声明,但不能修改和删除—有效期:当前进程有效期,退出就没有了

    语法 readonly value_name
    -p 查看全局只读变量


    3.7 声明变量类型

    语法 declare [+/-][rxi][变量名称=设置值] 或 declare -f

    参数说明:
    +/-  "-“可用来指定变量的属性,”+"则是取消变量所设的属性。

    -f  仅显示函数。

    -r  将变量设置为只读,没加变量值是查看全局只读变量

    x 指定的变量会成为环境变量,可供shell以外的程序来使用。

    i  [设置值]可以是数值,字符串或运算式。


    四、数学运算符

    4.1 expr 命令

    对数字的基本计算,做比较时,输出结果假为0,1为真;特殊符号用转义符\
    注意:比较两边要用空格隔开

    例如:

    【运算】
    # 小于
    [root@localhost ~]# expr 1 \< 3
    1
    
    # 大于
    [root@localhost ~]# expr 1 \> 3
    0
    
    # 乘法
    [root@localhost ~]# expr 1 \* 3
    3
    
    # 加法
    [root@localhost ~]# expr 1 \+ 3
    4
    
    # 除法
    [root@localhost ~]# expr 9 \/ 3
    3
    
    # 取余数
    [root@localhost ~]# expr 10 \% 3
    1
    
    
    # 计算位数
    [root@localhost ~]# expr length "hello word"
    10
    
    
    # 取第3-6位的字符
    [root@localhost ~]# expr substr "hello word" 3 6
    llo wo
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    4.2 常用运算表

    运算符意义
    +加法
    -减法
    *乘法
    /除法
    %求余数
    >或>=大于;大于等于
    <或<=小于;小于等于
    ++ 或 - -递增或递减,可前置也可以后置
    == 或 !=用于比较两个数字是否相等或不相等,正确返回 true或1,反之返回false或0
    &&或符号||逻辑与;逻辑或
    &放在命令后面为后台执行
    ^行首
    $调用、行尾
    *所有
    #注释
    eq(equal)等于
    ge(greater equal)大于或等于
    gt(greater than)大于
    le (less equal)小于或等于
    lt(less than)小于
    ne(not equal)不等于
    !
    ;换行
    >>追加

    例如

    [root@localhost ~]# ((a=1+2*3-2))
    [root@localhost ~]# echo $a
    5
    [root@localhost ~]# b=$((1+2))
    [root@localhost ~]# echo $b
    3
    
    # a++为先赋值再+1或减-1,++a或--a为先加1或减1,然后再进行赋值
    [root@localhost ~]# echo $((a++))
    5
    [root@localhost ~]# echo $((++a))
    7
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4.3 使用(())运算,效率高

    使用双引号方便多次计算

    例如:

    [root@localhost ~]# echo $((3+2*8/2))
    11
    
    
    • 1
    • 2
    • 3

    五、read命令

    5.1 read命令介绍

    可以从键盘上读取输入的值,赋予变量

    用法:
    read value1 value2 可以赋予多个变量
    -s 可以隐藏键盘上输入的值,例如ssh登陆时输入密码不会显示出来,实现隐藏密码。
    -p 可以给予提示,一般和-s一起用
    -t 指定输入时间,单位为秒,超过指定时间会直接退出
    -n 指定输入的值的长度,达到指定数量会值的结束指定。未达到指定的数量,可以按回车键完成
    -r 可以输入空格和特殊符号,例如@#¥,按回车键完成

    例如:

    【通过read赋予变量a、b变量值值】
    [root@localhost ~]# read a b 
    1 12  
    [root@localhost ~]# echo $a $b
    1 12
    
    【获取passwd变量,隐藏输入的值,并配置提示】
    [root@localhost ~]# read -p "input your password" -s passwd
    input your password
    [root@localhost ~]# echo $passwd
    123
    
    【指定变量ten,赋值的输入时间为10秒】
    [root@localhost ~]# read -t 10 ten
    [root@localhost ~]# echo $ten
    
    【指定变量long的长度为3】
    [root@localhost ~]# read -n 3 long
    aaa
    [root@localhost ~]# echo $long 
    aaa
    
    【指定变量值有空格和特殊符号】
    [root@localhost ~]# read -r null
    wosf  safs#@$@$#
    [root@localhost ~]# echo $null
    wosf safs#@$@$#
    
    【输入值时换行和不换行】
    [root@localhost ~]# echo 'input your name' ; read name 
    input your name
    mike
    [root@localhost ~]# echo $name
    mike
    [root@localhost ~]# echo -n 'input your name' ; read name 
    input your name mike
    [root@localhost ~]# echo $name
    mike
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    5.2 EOF

    EOF是(END Of File)的缩写,表示自定义终止符。既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d 就代表EOF。EOF一般是结合cat能够多行文本输出显示

    用法:
    大小写的eof都可以

    <<EOF        #开始
    
    ....                  #输入内容
    
    EOF            #结束
    
    • 1
    • 2
    • 3
    • 4
    • 5

    也可以用自定义的方式,例如:

    <<abc        #开始
    
    ....
    
    abc              #结束
    
    • 1
    • 2
    • 3
    • 4
    • 5

    六、date命令

    6.1 date命令的使用

    # 查看当前时间
    date
    
    
    # 设置时间
    date –s ”20140125 09:17:00”
    
    date +"%Y-%m/%d %H:%M:%S"
    
    # 年月日时分秒
    Y	详细年信息
    y	简略年信息
    M	分
    m	月
    H	当前的时间	单位时
    S	当前的时间	单位秒			
    s	秒	是从1970年1月1日00:00:00到现在的系统秒数
    %D 	输出为 年/月/日 的格式。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    6.2 时间是如何定义的

    linux系统和windows系统相差8个小时,都是以bios作为参考的
    windows是bios的时间,linux是以bios的时间做参考


    6.3 输出使用反引号

    echo `date`
    echo $(date)
    
    
    ()		#大括号可以用于调用变量,无指定为空
    
    # 例如嵌套使用
    变量=$( $())
    find /root/ -name *.txt
    VAR1 =$ (tar zcvf root.tar.gz $(find /root/ -name *.txt))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

  • 相关阅读:
    机器学习作业3____决策树(CART算法)
    计算机毕业设计ssm+vue基本微信小程序的加油站系统
    7 天找个 Go 工作,Gopher 要学的条件语句,循环语句 ,第3篇
    【小黑嵌入式系统第八课】初识PSoC Creator™开发——关于PSoC Creator&下载、创建项目、单片机中的hello world(点亮一个led)
    Npm 工具完全删除 - 安装 npm多版本管理工具 nvm
    《Unix 网络编程》05:TCP C/S 程序示例
    win10系统更新错误代码0x80244022怎么办
    在 Windows 中安装部署并启动连接 MongoDB 7.x(命令行方式启动、配置文件方式启动、将启动命令安装为系统服务实现开机自启)
    【华为OD题库-007】代表团坐车-Java
    向函数传递参数(传值、传引用、传const引用)
  • 原文地址:https://blog.csdn.net/qq_31649693/article/details/125871058