第十讲 Shell编程

第十讲  Shell基础

一、概述

  1.1 Shell是什么

    Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以

    用Shell来启动,挂起,停止甚至是编写一些程序。

    Shell还是一个功能强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以

    直接调用Linux系统命令。

  1.2 Shell的分类

    Bourne Shell:从1979起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh。

    C Shell:C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名。

    Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;

    C家族主要包括:csh、tcsh

    Bash:Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。

  1.3 Linux支持的Shell

    /etc/shells

二、Shell脚本的执行方式

  2.1 echo 输出命令

    命令格式:echo [选项] [输出内容]

      选项:

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

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

      范例:echo -e “\e[1;31m abcd \e[0m” #输出红色的abcd

        #输出颜色 30m~黑色  31m~红色  32m~绿色  33m~黄色

             34m~蓝色  35m~洋红   36m~青色   37m~白色

  2.2 第一个脚本

    vi hello.sh

    #!bin/Bash(不是注释,标注以下为shell程序)

    #The first Programm

    #Author:testuser

    echo -e "Mr. Su is the most honest man in China"

  2.3 脚本执行

    2.3.1 赋予执行权限,直接运行

      chmod 755 hello.sh

      ./hello.sh

    2.3.2 通过Bash调用执行脚本

      bash hello.sh

    2.3.3 dos2unix 

三、Bash基本功能

  3.1 历史命令与补全

    3.1.1 历史命令 history

      a)命令格式:history [选项] [历史命令保存文件]

        选项:

          -c  清空历史命令

          -w    把缓存中的历史命令吸入历史命令保存文件 ~/.bash_history

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

      c)历史命令的调用

        使用上、下箭头调用以前的历史命令

        使用"!n" 重复执行第n条历史命令

        使用"!!" 重复执行上一条命令

        使用"!字串"重复执行最后一条以该字串开头的命令

    3.1.2 命令与文件补全

      在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按”Tab“键就会自动进行补全

      按两次Tab会列出所有满足补全条件的命令或文件

  3.2 别名与快捷键

    3.2.1 命令别名

      命令格式:alias 别名=”原命令“ #设定命令别名

           alias        #查询命令别名

      命令执行顺序:

        1 第一顺位执行用绝对路径或相对路径执行命令

        2 第二顺位执行别名

        3 第三顺位执行Bash的内部命令

        4 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令

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

      删除别名:unalias 别名

    3.2.2 Bash常用快捷键

快捷键 作用
ctrl+A 把光标移动到命令行开头,如果我们输入的命令过长时使用
ctrl+E 把光标移动到命令行结尾
ctrl+C 强制终止当前命令
ctrl+L 清屏,相当于clear
ctrl+U 删除或剪切光标之前的内容
ctrl+K 删除或剪切光标之后的内容
ctrl+Y 粘贴ctrl+U或ctrl+K剪切的内容
ctrl+R 在历史命令中搜索
ctrl+D 退出当前终端
ctrl+Z 暂停,并放入后台
ctrl+S 暂停屏幕输出
ctrl+Q 恢复屏幕输出

  3.3 输入输出重定向

    3.3.1 标准输入输出

设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出

    3.3.2 输出重定向

类型 符号 作用
标准输出重定向  命令>文件

以覆盖的方式,把命令的正确输出输出到指定文件

或设备当中

命令>>文件

以追加的方式,把命令的正确输出输出到指定的文

件或设备当中

标准错误输出重定向  错误命令 2>文件

以覆盖的方式,把命令的错误输出输出到指定的文

件或设备当中

错误命令 2>>文件

以追加的方式,把命令的错误输出输出到指定的文

件或设备当中

正确输出和错误输出

同时保存

命令 > 文件 2>&1

以覆盖的方式,把正确输出和错误输出都保存到同

一个文件当中

命令 >> 文件 2>&1

以追加的方式,把正确输出和错误输出都保存到同

一个文件当中

命令 &> 文件

以覆盖的方式,把正确输出和错误输出都保存到同

一个文件当中

命令 &>> 文件

以追加的方式,把正确输出和错误输出都保存到同

一个文件当中

命令 >> 文件1 2>> 文件2

把正确的输出追加到文件1当中,把错误输出追加

到文件2当中

    3.3.2 输入重定向

      命令格式:wc [选项] [文件名]

        选项:

          -c  统计字节数

          -w    统计单词数

          -l   统计行数  

      ctrl+D进行统计键盘输入的信息

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

  3.4 多命令顺序执行与管道符

    3.4.1 多命令顺序执行

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

逻辑与

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

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

|| 命令1||命令2

逻辑或

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

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

      dd if=输入文件 of=输出文件 bs=字节数 count=个数(此命令可作为磁盘或大文件等的复制)

      选项:

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

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

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

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

      例如:date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date

      命令 && echo yes || echo no (此命令可判断命令是否被正确执行)

    3.4.2 管道符

      命令格式:命令1 | 命令2

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

      例如:

        ll -a /etc/ | more

        netstat -an | grep "ESTABLISHED"

      命令格式:grep [选项] "搜索内容" 文件名

        选项:

          -i         忽略大小写

          -n          输出行号

          -v          反向查找

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

  3.5 通配符和其他特殊符号

    3.5.1 通配符

通配符 作用
匹配一个任意字符
* 匹配0个或任意多个任意字符
[]

匹配括号中任意一个字符。例如:[abc] 代表一定匹配一个字符,或者是a

或者是b,或者是c

[-] 匹配括号中任意一个字符,-代表一个范围。例如[a-z]代表匹配一个小写字母
[^]

逻辑非,表示匹配不是中括号内的一个字符,例如:[^0-9]代表匹配一个不是数字的字符

    3.5.2 Bash中其他特殊符号

符号 作用
'' 单引号,在单引号中所有的特殊符号,如"$"和"`"(反引号)都没有特殊含义
""

双引号,在双引号中特殊符号都没有特殊含义,但"$"、"`"、"\"是例外,

拥有"调用变量的值"、"引用命令"、"转义符"的特殊含义

`

反引号。反引号括起来的内容是系统命令,在Bash中会先执行它,和$()作用

一样,不过推荐使用$(),因为反引号非常容易看错

$() 用来引用系统变量
# 在Shell脚本中,#开头代表注释
$

用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到

变量的值

\

转义符。即跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出"$"

,而不当做是变量的引用

四、Bash变量

  4.1 用户自定义变量

    4.1.1 什么是变量

      变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或一个数字,就把

      它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设

      置,变量也可以用于保存暂时信息。

    4.1.2 变量设置规则

      a)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。

      b)在Bash中,变量的默认类型都是字符串型,如果要进行数值计算,则必须指定变量的类型为数值型。

      c)变量用等号连接值,等号左右两侧不能有空格。

      d)变量的值如果有空格,则需要使用单引号或双引号括起来。

      e)在变量的值中,可以使用"\"转义符。

      f)如果需要增加变量的值,可以进行变量值的叠加。不过变量需要用双引号包含"$变量名"或用${变量名}包含。

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

      h)环境变量建议大写,便于区分。

    4.1.3 变量的分类

      a)用户自定义变量

      b)环境变量:主要保存和系统操作环境相关的数据

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

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

    4.1.4 本地变量

      变量定义:name="test user"

      变量叠加:

          aa=123

          aa="$aa"456

          aa=${aa}789  

      变量调用:echo $name

      变量查看:set

      变量删除:unset name        

  4.2 环境变量

    4.2.1 环境变量定义

      用户自定义变量只在当前Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell中都有效。如果把

      环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中都生效。

    4.2.2 设置环境变量

      export 变量名=变量值   #声明变量

      evn            #查询变量

      unset 变量名       #删除变量

    4.2.3 常用环境变量

      PATH:系统查找命令的路径

      变量叠加:PATH="$PATH":/root/sh

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

        \d:显示日期,格式为“星期 月 日”;

        \h:显示简写主机名,如默认主机名为localhost

        \t:显示24小时制时间,格式为"HH:MM:SS"

        \T:显示12小时制时间,格式为"HH:MM:SS"

        \A:显示24小时时间,格式为"HH:MM"

        \u:显示当前用户名

        \w:显示当前所在目录的完整目录

        \W:显示当前所在目录的最后一个目录

        \#:执行的第几个命令

        \$:提示符,如果是root用户会显示提示符为“#”,如果是普通用户则显示提示符为"$"

  4.3 位置参数变量

    4.3.1 位置参数变量

位置参数变量 作用
$n

n为数字,$0代表命令本身,$1-$9代表第一到第

九个参数,十以上的参数需要用大括号包含,如${10}

$* 代表命令行中所有的参数,把所有参数看成一个整体
$@ 代表命令行中所有的参数,将每个参数区分对待
$# 代表命令行中所有参数的个数

  4.4 预定义变量

    4.4.1 预定义变量

预定义变量 作用
$?

最后一次执行的命令的返回状态,如果这个变量的值为0,证明

上个命令正确执行,否则表示上个命令执行不正确

$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)

    4.4.2 接收键盘输入

      read [选项] [变量名]

        选项:

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

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

          -n “字符数”     read命令只接收指定的字符数,就会执行

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

五、Bash的运算符

  5.1 数值运算与运算符

    5.1.1 declare 声明变量类型

      命令格式:declare [+/-] [选项] [变量名]

        选项:

          -:  给变量设定类型属性

          +:  取消变量的类型属性

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

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

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

    5.1.2 数值运算 

        aa=11

        bb=22

      a)方法1:声明cc为数值类型

        declare -i cc=$aa+$bb

      b)方法2:expr或let数值运算工具

        dd=$(expr $aa + $bb) #注意,“+”号两边必须要有空格

      c)方法3:”$((运算式))“或“$[运算式]”

        ff=$(($aa+$bb))

        gg=$[$aa+$bb]

    5.1.3 运算符

优先级 运算符 说明
13 -、+ 单目负、单目正
12 !、^ 逻辑非、按位取反或补码
11 *、/、% 乘、除、取模
10 +、- 加、减
9 <<、>> 按左位移、按右位移
8 <=、>=、<、> 小于或等于、大于或等于、小于、大于
7 ==、!= 等于、不等于
6 & 按位与
5 | 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑或
1

=、+=、-=、

*=、/=、%=

<<=、>>=

赋值、运算且赋值

  5.2 变量测试与内容替换

变量置换方式 变量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

六、环境变量配置文件

  6.1 环境变量配置文件简介

    6.1.1 重新加载配置文件

      命令格式:source 配置文件或 . 配置文件

    6.1.2 环境变量配置文件简介

      定义对系统的操作环境生效的系统默认环境变量。比如:PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量。

    6.1.3 环境变量配置文件

      a)/etc/profile

      b)/etc/profile.d/*.sh

      c)~/.bash_profile

      d)~/.bashrc

      e)/etc/bashrc

      注意:etc下的配置文件对所有用户都生效。c和d只对当前家用户生效

  6.2 环境变量配置文件作用

    6.2.1 /etc/profile的作用

      a)USER变量:

      b)LOGNAME变量:

      c)MAIL变量

      d)PATH变量

      e)HOSTNAME变量

      f)HISTSIZE变量

      g)umask:

      h)调用/etc/profile.d/*.sh文件

    6.2.2 ~/.bash_profile的作用

      a)调用了~/.bashrc文件

      b)在PATH变量后面加入了":$HOME/bin"这个目录

    6.2.3 ~/.bashrc的作用

      a)定义系统别名

      b)调用了/etc/bashrc

    6.2.4 /etc/bashrc的作用(不需要输入用户名和密码,直接登录的情况下)

      a)定义PS1变量

      b)umask

      c)PATH变量

      d)调用/etc/profile.d/*.sh文件

  6.3 其他配置文件和登录信息

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

      ~/.bash_logout

    6.3.2 其他配置文件

      ~/.bash_history  #历史命令配置文件       

    6.3.3 Shell登录信息

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

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

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

        转义符在/etc/issue.net文件中不能使用

        是否显示欢迎信息,由ssh配置文件/etc/ssh/sshd_config决定,加入"Banner /etc/issue.net"行才能显示

        记得要重新启动SSH服务

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

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

posted @ 2022-05-04 16:56  flash-bird  阅读(46)  评论(0)    收藏  举报