【测试语言基础篇二】Shell脚本之基础知识学习(一)

一、shell简介

shell是一个运行在linux/UNIX环境下的命令行解释器。是介于操作系统内核和用户之间的一个“中介”,shell通过提供一个交互式的输入输出环境,可以解释和运行用户输入的命令,并将程序的运行结果输出给用户。

在当前的PC和手机上运行应用程序,通过鼠标双击桌面图标,或者点击手机屏幕上的App图标就可以了。而早期的计算机比较昂贵,就和现在的超算一样,一台机器很多人共同使用,而且没有图形交互界面,那用户是如何使用计算机,如何在计算机上跑自己的程序呢?很简单,通过多个终端(一般是键盘和显示器)和计算机连接,不同的用户通过终端,使用各自的账户登录系统,登录系统后,操作系统会给每个登录的用户启动一个shell程序,通过这个交互式的命令行环境,用户就可以输入和运行不同的命令,或者运行指定的脚本。

1、Bash介绍

shell解释器本身是一个应用程序,shell解释器是UNIX/Linux最重要的应用工具之一,早期的UNIX下默认配置的shell解释器是sh,sh是Bourne Shell的简称,一般位于/usr/bin/sh或/bin/sh目录下。

wit@pc:/# whereis sh
sh: /usr/bin/sh /usr/share/man/man1/sh.1.gz

Bash是目前Linux下使用最广泛的一个shell解释器,Bash是Bourne Again Shell的简称,全称是:GNU Bourne-Again SHell。Bourne shell是由斯蒂芬-波恩编写的UNIX shell,后续随着UNIX、Linux操作系统家族的不断演进和发展,对应的shell版本也随之做了很多改进。

Bash对sh做了很多改进,用户体验比sh提高了不少,目前是很多Linux操作系统默认配置的shell解释器。在Ubuntu-20.04下,我们可以通过查看SHELL变量的值来查看当前使用的shell解释器:

wit@pc:/# echo $SHELL
/bin/bash

2、其他的shell解释器

除了常用的Bash解释器外,还有一些其他常用的shell解释器:

  • shell:(/usr/bin/csh)
  • shell:(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)
  • zsh:不兼容Bash,但可以通过其特有的仿真模式(emulation mode)来兼容Bash、csh、ksh的仿真

3、为什么要学习shell脚本?

脚本应用知识对于从事Linux运维、系统管理的工程师来说是必须要掌握的。对从事嵌入式开发、Linux开发的人来说,想要了解系统上电后,系统是如何从内核、用户进程到启动脚本启动各种服务的,掌握shell编程的一些语法和细节是很有必要的,它会帮你了解系统启动的更多细节。

总之,一句话,如果你想精通Linux,无论是系统管理、运维,还是开发,掌握shell编程,是一把利器,会让你后续的学习和工作事半功倍,如虎添翼。

二、shell 启动

现在的Linux操作系统一般都支持两种方式启动:文本模式和图形模式。文本模式一般应用于服务器这种不需要图形界面的场景,用户远程登录服务器,通过命令行与服务器进行交互;而普通的PC桌面操作系统一般会运行在图形模式下,通过桌面管理器和图标,方便用户通过鼠标点击进行交互。

根据操作系统这两种不同的启动方式,shell的启动一般分为两种,以Bash为例,可以分为两种:

  • 文本模式下的Bash启动
  • 图形模式下的Bash启动

1、文本模式下的Bash启动

在Ubuntu为例,系统上电后,Linux内核初始化一系列组件,成功启动后,会开启第一个用户进程:init进程,然后在init进程中继续运行用户登录login程序,用户输入的用户名和密码验证通过后,会根据脚本中的配置,启动默认的shell解释器:Bash,此时你就会看到一个交互式的命令环境,Bash会不断地解释和运行用户输入的各种命令。

在Ubuntu-20.04环境下,敲击快捷键Ctrl+Alt+F3,就会进入Ubuntu的文本模式,登录tty3终端,输入用户名和密码后,就可以进入到Bash的交互环境,等待用户输入各种命令运行:

2、图形模式下的Bash启动

现在的桌面操作系统一般模式是在图形模式下启动,内核初始化完成后,会启动一个桌面管理器,加载桌面环境和各种应用程序图标,用户通过鼠标点击来运行不同的程序。

为了能在图形模式下运行Bash,不同的操作系统一般都会提供了虚拟终端模拟软件,如在Ubuntu-20.04下,就有一个叫作Terminal的虚拟终端软件:


点击运行,就会运行这个Terminal终端程序,并启动默认的shell解释器:Bash


使用pstree命令查看进程树,可以看到虚拟终端terminal和Bash之间的关系:

# pstree
gnome-terminal-─┬─bash───pstree

通过进程关系我们可以看到,当用户点击terminal图标启动虚拟终端工具后,Linux是以gnome-terminal进程来运行这个终端工具的,然后基于整个进程创建一个子进程bash来运行Bash shell

在 Ubuntu-20.04 下,使用 Ctrl+Alt+F2 和 Ctrl+Alt+F3快捷键,可以在图形模式和文本模式下切换,通过不同的终端来启动Bash。

三、shell 命令执行

当我们在Bash的交互环境下输入命令时,Bash是如何执行我们输入的各种命令的呢?

zhaixue@ubuntu:~$ time

real 0m0.000s
user 0m0.000s
sys 0m0.000s
zhaixue@ubuntu:~$ ls
cscope.out Documents Music Public Videos
Desktop Downloads Pictures Templates vmware-tools-distrib
zhaixue@ubuntu:~$ ps
PID TTY TIME CMD
3016 pts/0 00:00:00 bash
3181 pts/0 00:00:00 ps

我们在bash交互环境下输入的命令,bash会新建一个子进程,然后各个命令以子进程的形式运行,运行结束后,子进程退出,重新回到shell当前的进程,等待用户输入新的命令执行,周而复始。

shell在读取用户输入的命令时,首先会把用户输入的一行命令字符串分解成一个个单词和运算符,并使用引用规则对这些单词进行解析,把这些单词解析成命令、变量或其他结构,执行这些命令,等待其退出的状态,并根据这个状态来决定后续的执行或处理操作。

shell中的注释符是#,shell在解析命令时,遇到#,会将注释的这一整行都忽略掉,不再进行解析。

命令被拆分成单词后,就会得到一个一个的简单命令,及其可选的参数列表。shell会根据这个命令名,去搜索这个命令,搜索到了才会去执行它,搜索的顺序如下:

  • 看看是不是有同名的函数
  • shell内部的命令
  • 文件系统PATH路径下的可执行二进制文件

命令的退出状态

在Linux或UNIX世界中,如果命令运行正确,不会给任何提示,一切都是安静的,说明一切都是正确的。只有错误和异常发生,才会有警告或错误的信息出来。当一个命令运行结束后,它的退出状态就是当前shell使用waitpid观察其子进程的返回值。命令正确执行,返回值为0,命令执行错误,返回值是1~255中间的某一个,不同的返回值代表不同的错误,可以使用perror来解析每个错误码对应的具体错误信息。

四、shell 命令提示符

Linux是个多用户操作系统,可以同时登陆多个用户,对于登陆系统的每一个用户,Linux系统一般都会启动一个默认的shell解释器来跟用户交互,不同的用户可以指定自己的shell解释器,在/etc/passwd文件下,有各个用户的账户密码配置,包括指定的默认shell解释器:

root:x:0:0:root:/root:/bin/bash
zhaixue:x:1000:1000:zhaixue.cc,,,:/home/zhaixue:/bin/bash
tftp:x:127:134:tftp daemon,,,:/srv/tftp:/usr/sbin/nologin
statd:x:129:65534::/var/lib/nfs:/usr/sbin/nologin

对于一些特殊的用户,比如用来TFTP服务、NFS服务的用户,它们主要用来使用系统的某一项资源,它们一般不需要启动bash这个服务,所以一般将这个shell选项设置成nologin。

对于普通的用户,启动Bash程序后,一般会有一个$的提示符,表示当前用户是普通用户

zhaixue@ubuntu:~$

而对于超级权限用户:root用户,一般会有一个#的提示符,表示当前用户是超级权限用户

wit@pc:~#

1、修改命令提示符

在Ubuntu环境下,以笔者的虚拟机为例,使用普通用户(zhaixue.cc)登录时,打开一个shell终端,对应的提示符格式为:

  1. zhaixue@ubuntu:~$ pwd
  2. /home/zhaixue
  3. zhaixue@ubuntu:~$ echo $HOME
  4. /home/zhaixue
  5. zhaixue@ubuntu:~$ cd /home/linux-5.10-rc3/
  6. zhaixue@ubuntu:/home/linux-5.10-rc3$

打开一个shell终端,默认打开目录路径为~,即$HOME的值,显示颜色为蓝色,这个值在不用的用户登录下不一样,总之会对应登录用户的家目录。$提示符表示当前是普通用户,只能对$HOME下的文件进行读写操作,对系统其它目录下的文件只有读的权限。@前面的绿色字符串表示当前用户,@后面的绿色字符串表示当前系统。

shell的终端提示符格式是由~/.bashrc文件中的命令提示符环境变量PS1指定的:

if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

其中@前面的\u表示当前用户名称,\h表示主机名称,\w表示工作目录,每个选项前的[\033[01;32m]用来指定显示的颜色,大家可以根据自己的爱好,定制自己的颜色。当打开的工作目录很深时,命令提示符就会很长,留给后续命令的输入空间很少了,此时你可以删除一些必要的显示选项。比如我的root用户就设置得很短,修改/root/.bashrc中的PS1变量:

  1. PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@pc\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

然后在shell终端下切换到root用户,我的shell终端的命令提示符就变成了下面的样子,而且跟普通用户一样,可以彩色显示:

  1. zhaixue@ubuntu:~$ su
  2. Password:
  3. root@pc:/home/zhaixue# cd ~
  4. root@pc:~# pwd
  5. /root
  6. root@pc:~#

2、shell显示颜色表

字体颜色字体背景颜色显示方式
30:黑色40:黑色0:默认配置
31:红色41:深红色1:高亮显示
32:绿色42:绿色4:下划线
33:黄色43:黄色5:闪烁
34:蓝色44:蓝色7:反白显示
35:紫色45:紫色8:隐藏
36:深绿色46:深绿
37:白色47:白色
显示举例:
  1. \033[1;32;40m 1是高亮显示,可选;31设置字体颜色为绿色;40m是字体背景颜色
  2. \033[0m 0表示恢复终端默认颜色
  3. \[\033[01;32m\]\u@pc 设置用户名为字体颜色为绿色
  4. \[\033[00m\]: 设置冒号分隔符:颜色为默认颜色,即白色
  5. \[\033[01;34m\]\w 设置路径名称为蓝色
  6. echo -e "\033[01;34mhello" 将字符串hello显示为蓝色

思考:如何通过shell配置文件,来指定不同用户指定的shell?修改/etc/passwd就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值