bash新手入门指南-安装bash

618 阅读1分钟

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

图片.png

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官网上可以找到维护者的新息,进而可以获取签名的公钥。

图片.png

图片.png

即可下载到公钥,具体的地址为: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

图片.png

如果出现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

图片.png

简单尝试理解shell

shell宏处理器

从本质上来说,shell可以被看作是一个宏处理器,对脚本进行扫描和替换,主要有以下三种类型:

  • 变量替换
  • 命令替换
  • 通配符展开

关于变量替换,举个例子,有如下脚本:

#!/bin/bash
​
a="world"
echo hello ${a}

这里${a}就是一个宏,shell会将其替换为world,再执行echo命令。

关于命令替换,举个例子,有如下脚本:

#!/bin/bashecho 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中,我们可以方便地调用操作系统提供的各种程序命令,比如lshostname等等。通过将这些命令组合在一起,并加入 shell 本身提供的流程控制语句(如条件判断、循环等),就形成了一个可执行的脚本,通常称为shell脚本。

比如如下脚本:

#!/bin/bashfor 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_1dir_66个目录。

总结

linux中有众多的shell解释器,bash只是其中一种,它的全称是Bourne Again Shell,是使用最多的,最流行的shell解释器,其安装升级非常简单,只需要编译三板斧./configuremakemake install 即可完成升级。

shell中,核心点就是自身的宏处理器,它会先将脚本逐一解析,解析替换为一个个命令后,再进行执行。