bash新手入门指南-安装bash
在日常使用linux环境中,面对shell脚本的时候,你是否感到困惑,这脚本,怎么这么复杂,甚至于多一个、少一个空格都不行呢?
比如下面这段代码:
a="abcd"
if [ $a='abc' ];then
echo "is abc"
else
echo "not is abc"
fi
这段代码,不会报错,但是肯定不符合编写代码的时候的预期。这是因为sh特性导致的。所以,让我们从头来学习最流行的shell解释器:bash。
实验机器所使用的环境为:
[root@localhost bash]# hostnamectl
Static hostname: localhost.localdomain
Icon name: computer-vm
Chassis: vm
Virtualization: vmware
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-1160.el7.x86_64
Architecture: x86-64
[root@localhost bash]#
虽然各个Linux发行版都内置了bash软件,但是工欲善其事,必先利其器,本篇文章还是来安装升级一下bash至目前的最新版本。
什么是bash
bash全称是Bourne Again Shell,是众多shell的一种,是GNU项目开发的标准shell,也是使用最多的,最流行的shell解释器(几乎是所有Linux发行版默认使用的解释器),所以学习它,准没错。
项目地址: www.gnu.org/software/ba…
版本地址: ftp.gnu.org/gnu/bash/
bash和默认传统的sh是不一样的,sh是最基础的shell解释器,而bash在兼容sh的基础上叠加了一些自己的特性,一般而言,在linux描述shell,指的都是bash,比如在centos 7.9系统中,其默认sh已经被指向了bash:
bash升级安装
目前最新的bash版本为bash-5.3-rc1.tar.gz,最稳定的版本是bash-5.2.tar.gz,如果是生产环境,建议使用稳定版本,这里使用最新版本进行升级。
版本校验
目前流行的软件,在发布的时候,都会使用gpg对文件进行签名。如果你在其他第三方镜像中下载的软件,且担心代码被投毒,不妨先对下载下来的包体进行签名校验,没问题后再进行安装也不迟。
首先,需要先安装pgp2软件。
yum install gnupg2
找到包体和签名,如bash-5.3-rc1.tar.gz包体的签名为bash-5.3-rc1.tar.gz.sig,下载包体和签名:
wget http://ftp.gnu.org/gnu/bash/bash-5.3-rc1.tar.gz
wget http://ftp.gnu.org/gnu/bash/bash-5.3-rc1.tar.gz.sig
光有包体和包体的签名,还不够,还需要找到签名的公钥,对于bash而言,在gnu官网上可以找到维护者的新息,进而可以获取签名的公钥。
即可下载到公钥,具体的地址为:tiswww.cwru.edu/~chet/gpgke…
下载该公钥
wget https://tiswww.case.edu/php/chet/gpgkey.asc
将导入到gpg中
gpg2 --import gpgkey.asc
最后使用公钥进行校验
gpg2 --verify bash-5.3-rc1.tar.gz.sig bash-5.3-rc1.tar.gz
如果出现gpg: Good signature from "Chet Ramey <chet@cwru.edu>"则可以证明该包体没有被修改过,可以放心使用。
安装最新版本
下载最新版本包
wget http://ftp.gnu.org/gnu/bash/bash-5.3-rc1.tar.gz
如果在下载该包体较慢,可以尝试第三方源,比如:mirrors.tuna.tsinghua.edu.cn/gnu/bash/ 进行下载。
解压文件
tar zxvf bash-5.3-rc1.tar.gz
安装必须的依赖
yum install gcc make -y
编译安装bash软件
cd bash-5.3-rc1
./configure
make
cp -a bash /usr/local/bin/
这里不继续进行
make install了,可以保留老版本的bash,如果需要使用新版本bash的话,可以直接使用/usr/local/bin/bash即可。
查看版本号
/usr/local/bin/bash --version
简单尝试理解shell
shell宏处理器
从本质上来说,shell可以被看作是一个宏处理器,对脚本进行扫描和替换,主要有以下三种类型:
- 变量替换
- 命令替换
- 通配符展开
关于变量替换,举个例子,有如下脚本:
#!/bin/bash
a="world"
echo hello ${a}
这里${a}就是一个宏,shell会将其替换为world,再执行echo命令。
关于命令替换,举个例子,有如下脚本:
#!/bin/bash
echo domain name: $(hostname)
这里的$() 表示执行执行里面的内容,然后将结果替换到该位置,比如在该机器下结果为:
[root@localhost ~/bash]# bash substitution.sh
domain name: localhost.localdomain
[root@localhost ~/bash]#
关于通配符展开,举个例子,有如下脚本:
#!/bin/bah
/etc/*.conf
当解释器运行到/etc/*.conf时,会展开为/etc/下所有的*.conf文件名,可以使用bash -x进行调试输出:
[root@localhost ~/bash]# bash -x wildcardExp.sh
+ /etc/asound.conf /etc/chrony.conf /etc/dracut.conf /etc/e2fsck.conf /etc/host.conf /etc/kdump.conf /etc/krb5.conf /etc/ld.so.conf /etc/libaudit.conf /etc/libuser.conf /etc/locale.conf /etc/logrotate.conf /etc/man_db.conf /etc/mke2fs.conf /etc/nsswitch.conf /etc/oci-register-machine.conf /etc/oci-umount.conf /etc/resolv.conf /etc/rsyslog.conf /etc/sestatus.conf /etc/sudo.conf /etc/sudo-ldap.conf /etc/sysctl.conf /etc/vconsole.conf /etc/yum.conf
wildcardExp.sh: line 3: /etc/asound.conf: Permission denied
[root@localhost ~/bash]#
所以,对于shell而言,它不像其他编程语言,它并不直接执行命令,而是先进行文本处理、命令、变量替换,通配符展开等,形成一条完整的命令,然后再执行。
shell编程
在shell中,我们可以方便地调用操作系统提供的各种程序命令,比如ls、hostname等等。通过将这些命令组合在一起,并加入 shell 本身提供的流程控制语句(如条件判断、循环等),就形成了一个可执行的脚本,通常称为shell脚本。
比如如下脚本:
#!/bin/bash
for i in $(seq 1 10)
do
mkdir dir_${i}
if [[ ${i} > 5 ]];then
break
fi
done
该脚本首先调用seq 1 10命令,进行命令替换,使用for进行迭代seq命令产生的值,使用mkdir逐一进行创建目录。当判断到i的值大于5的时候,则退出该循环。
脚本的结果为创建dir_1 到dir_6这6个目录。
总结
linux中有众多的shell解释器,bash只是其中一种,它的全称是Bourne Again Shell,是使用最多的,最流行的shell解释器,其安装升级非常简单,只需要编译三板斧./configure、make、make install 即可完成升级。
在shell中,核心点就是自身的宏处理器,它会先将脚本逐一解析,解析替换为一个个命令后,再进行执行。