走进Linux_初探shell步入bash

引:在Linux的环境下,如果你不懂bash是什么,那么其他的东西就不用学了!

认识bash这个shell

管理整个计算机硬件的其实是操作系统的内核,这个内核是需要保护的,所以我们一般用户就只能通过shell来跟内核通信,以让内核达到我们所想要达到的工作,那么系统。

硬件、内核与shell

下面是硬件、内核与shell的关系:

shell

我们必须要通过“shell”将我们输入的命令与内核通信,好让内核可以控制硬件来正确无误地工作。

其实shell的功能只是提供用户操作系统的一个接口,因此这个shell需要可以调用其他软件才好。只要能够操作应用程序的接口都能够称为shell。 狭义的shell指的是命令行方面的软件,包括bash等。广义的shell包括图形界面的软件,因为图形界面也能够操作各种应用程序来调用内核工作。

为什么要学命令行界面的shell

  1. 命令行界面的shell:大家(几乎所有发行版)都一样
  2. 远程管理:命令行界面就是比较快,而且较不容易出现断线或者信息外流的问题。
  3. Linux的任督二脉:shell是也。因为要想将自己的主机管理好,良好的shell程序编写是必须的。

系统合法与/etc/shells功能

目前我们的Linux有下面几个可以用的shell,我们可以通过查看/etc/shells这个文件,可以看到如下:

1
2
3
4
5
6
7
8
/bin/sh   (已经被/bin/bash所替代)
/bin/bash (Linux默认的shell)
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh (整合C shell,提供了更多的功能)
/bin/csh (已经被/bin/tcsh所替代)

Linux默认的就是bash。系统上合法的shell都要写入/etc/shells这个文件中,因为系统某些服务在运行过程中,会去检查用户能够使用的shells,而这些shell的查询就是借助/etc/shells这个文件。

用户默认取得的shell可以通过查看/etc/passwd文件,如下:

1
2
3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

bash shell的功能

bash的优点如下:

  1. 命令记忆能力,~/.bash_history里面会记录前一次登录所执行过的命令,而这一次登录都被暂存在临时内存中,成功注销后,本次执行的命令会记录到文件中。最大的好处就是可以查询曾经做过的操作,利于排错。
  2. 命令与文件补全功能(Tab键的好处)
  3. 命令别名设置功能(alias)执行如下得命令:

    alias 简化命令=’实际命令’ (设置别名); unalias 简化命令(解除别名)

  4. 作业控制、前台、后台控制
  5. 程序脚本
  6. 通配符(*)

shell的变量功能

变量是bash环境中非常重要的一个玩意儿。

什么是变量

变量: 就是以一组文字或符号等,来替代一些设置或者一串保留的数据。

变量的方便性在于:

  1. 变量的可变性与方便性
  2. 简化bash环境操作
  3. 脚本程序设计的好帮手

变量的分类

在Linux中,变量分为环境变量(全局变量) 和 局部变量。
环境变量能被子进程继承,而局部变量只能在当前进程中使用。

不论是环境变量还是局部变量。他们又都可以分为系统变量 和 自定义变量。系统变量是系统启动时自动创建的变量,往往为系统运行提供支持;而自定义变量是用户自己定义的。一般而言,系统变量全为大写,自定义变量全为小写。

变量的显示与设置:echo,unset

  1. 变量的显示:echo

    读变量,只需要在变量名称前面加上$,或者是以${变量}的方式来显示就可以。

  2. 变量的修改:“=”

    只需要用等号连接变量与它的内容就好了。它具有如下设置规则:

    • 等号两边不能直接接空格符
    • 变量名称只能是英文字母与数字,但是开头字符不能是数字
    • 变量内容若有空格可使用双引号或单引号将变量的内容结合起来
    • 可以用转义字符”\”将特殊符号(如enter、$、\、空格符、!等)变成一般字符。
    • 在一串命令中,还需要其他的命令提供的信息,可以使用反单引号“`命令`”或“$(命令)”
    • 若该变量为了增加变量内容时,则可用“$变量名称”或${变量}累加内容,后用冒号连接。
    • 若该变量需要在其他自进程执行,则需要以export来使变量变成环境变量。
    • 通常大写字符为系统默认变量,自行设置变量可以使用小写字符,方便判断。
    • 取消变量的方法为使用“unset 变量名称”

      什么是子进程: 在一个bash中开启一个新的bash,那么原本的bash称为父进程,新的bash称为子进程。 子进程会继承父进程的所有环境变量,而父进程的局部变量只能在父进程中使用。

环境变量的功能

环境变量可以帮我们达到很多功能,包括主文件夹的变换、提示符的显示、执行文件查找的路径等。在shell环境下,可以通过env与export查看环境变量。下面主要介绍一下主要的环境变量:

  • HOME:用户主目录,当我们使用cd 或cd ~时就会调用这个环境变量找到用户主目录
  • SHELL:当前使用的SHELL,默认使用/bin/bash
  • HISTSIZE:历史命令的最大条数
  • PATH:可执行文件的查找路径。这是一个非常重要的环境变量,当我们直接写一个命令时,系统就会在PATH路径中寻找这个命令,这样我们在执行命令的时候就不用输命令完整的路径了。多个路径之间用:分隔
  • LANG:当前系统的语言
  • RANDOM:随机数生成器的路径。该路径默认指向/dev/random这个文件,这个文件是一个随机数生成器,当我们使用$RANDOM时就能获得一个0-32767之间的随机整数

当然我们还可以通过set来查看所有变量(含环境变量和自定义变量):这里也解释几个比较重要的变量:

  • PS1:命令提示符,在命令输入光标前有一串用中括号括起来的信息,这就是命令提示符。命令提示符究竟需要显示哪些信息,这就是由PS1这个局部变量决定的。由于它是局部变量,因此子进程中无法继承这个变量,子进程拥有自己的PS1。
  • $:当前shell的PID,可以通过如下命令查看当前shell的PID:

    echo $$

  • ?:上个命令的执行结果,上个命令若执行成功,则echo $?就会返回0;若上个命令执行失败,则该值为一个非0整数。

变量内容的删除与替换

操作方式 说明
${变量名#关键词} 从变量值的头部开始,依次向后删除到关键词第一次出现的位置为止
${变量名##关键词} 从变量值的头部开始,依次向后删除到关键词最后一次出现的位置为止
${变量名%关键词} 从变量值的尾部开始,依次向前删除到关键词第一次出现的位置为止
${变量名%%关键词} 从变量值的尾部开始,依次向前删除到关键词最后一次出现的位置为止
${变量名/旧字符串/新字符串} 从变量值的头部开始,依次向后找到第一个旧字符串,并将其替换
${变量名//旧字符串/新字符串} 将变量值中所有的旧字符串替换成新字符串

Bash Shell的操作环境

路径与命令的查找顺序

基本上,命令运行的顺序可以这样看:

  1. 以相对/绝对路径执行命令,例如:“/bin/ls”或“./ls”
  2. 由alias找到该命令来执行
  3. 有bash内置的(builtin)命令来执行
  4. 通过$PATH这个变量的顺序找到的第一个命令来执行

bash的登录与欢迎环境:/etc/issue,/etc/motd

  1. /etc/issue:放置终端机接口登录成功的界面提示的字符。
  2. /etc/issue.net:放置telnet远程登录成功的界面提示的字符。
  3. /etc/motd:如果你想让用户登录后取得一些信息,可以将信息加入其中。比如告知登录者系统将在什么时候维护。

bash的环境配置文件

由于系统有一些环境配置文件的存在,让bash在启动时直接读取这些配置文件,所有已进入bash就能够取得一堆有用的变量。而这些配置文件又可以分为全体系统的配置文件以及用户个人偏好配置文件。要注意的是,之前我们说的命令别名、自定义的变量在你注销bash后就会失效。所以你想要保留你的设置,就得要讲这些设置写入配置文件才行。,下面就看看这些东西:

  1. login shell与non-login shell

    login shell和non-login shell是两种shell登录的方式,它们登录后加载的环境配置文件有所不同。

    • login shell在获取bash前需要进行一套完整的登录过程,这个登录过程就称为login shell。所谓“完整的登录过程”指需要输入用户名和密码。login shell其实只会读取这两个配置文件:/etc/profile和(~/.bash_profile或 ~/.bash\_login或~/.profile)
    • non-login shell获取bash不需要输入密码的登录过程称为non-login shell。如在bash中直接输入bash,从而打开一个子bash,这个过程不需要输入密码,因此称为non-login shell。比如在图形界面中。
  2. /etc/profile:系统级的环境变量(login shell才会读) 。
    该文件存放系统级环境变量,所有的用户都会拥有,一般不建议修改这个文件。
  3. ~/.bash_profile:用户个人的环境变量(login shell才会读)
    当/etc/profile中的环境变量加载完毕后就会加载本文件,本文件中定义了当前用户的环境变量。
  4. ~/.bashrc:non-login shell会读取的环境配置文件
    当用户以non-login方式登录后,只会加载这个文件,该文件会对一些操作加上安全询问。这个文件不管哪种登录方式都会被加载,因此这里可以存放别名。
  5. /etc/man.conf:设置man的存放路径
    如果使用源码安装软件的话(非rpm、yum),一般软件会安装在自定义的目录中(一般为/usr/local/软件名)。那么软件中的man文件就无法被系统找到,从而无法通过“man+命令”找到这个软件的命令帮助文档。我们需要手动将该软件的man目录添加到/etc/man.conf中去,从而执行“man+命令”就能找到这个目录的帮助文档。
  6. ~/.bash_history:存储用户历史命令
  7. ~/.bash_logout:记录注销后系统执行的操作

通配符和特殊字符

通配符

在bash的操作环境中还有一个非常有用的功能,那就是通配符。下面是一些常用的通配符:

符号 意义
* 代表任意多个字符
? 代表一个字符
[] [abcd]:代表该范围内的一个字符
[-] [a-z]:代表a-z之间的一个字符
[^] [^a-z]:代表除了a-z以外的所有字符

特殊字符

下面是bash环境中的特殊符号:

符号 内容
# 注释
\ 转移字符,将特殊字符转为普通字符
; 分隔多个目录,使得依次执行
~ 用户主目录
$ 变量的起始符
& 将目录置于后台执行
!
/ 目录分隔符
>,>> 数据流重定向,输出导向
<,<< 数据流重定向,输入导向
‘’ 不含变量置换功能
“” 含有变量置换功能
`` 中间为待执行的命令,和$()一致
() 中间为子shell的起始和结束
{} 中间为命令块

参考

  1. 《鸟哥的Linux私房菜》