Bash

Shell 与 Bash

管理整个计算机硬件的是操作系统的内核(Kernel),一般我们是不能直接访问这个内核。我们可以通过Shell来让内核完成我们想要的效果。另外Shell也到保护操作系统的作用,如果内核能被用户随意操作,若使用不当就可以导致操作系统崩溃!但用户总需要操作系统,那么就有着应用程序的诞生(比如QQ就是一个应用程序)。那么应用程序就是我们操作计算机最外一层,就像鸡蛋壳一样。

什么是Shell呢?只要能操作应用程序的接口都是Shell,可以说Shell是操作应用程序的接口的总称。狭义的Shell是指一些命令行软件,比如Linux默认的bash(borne again shell)和Windows的cmd(command)就是命令行软件,这两个命令行软件都可以调用其他应用程序(比如bash里面的man命令就是一个独立的应用程序)。广义的Shell则包括图形化界面。 下面要讲的bash就是Linux下面默认的Shell。

Shell变量

变量(variable)这个词汇,在编程语言中很重要的一个基础知识。其作用不言而喻。

变量的显示与设置

  • 显示一个变量:echo $变量名。
    这里写图片描述
  • 设置一个变量:变量名=变量值。
    这里写图片描述

  • 在bash中,当一个变量名称尚未被设置值的时,默认为空。也就是说你是用对没有设置值的变量使用echo命令输出值,会是是一行空白。
    这里写图片描述

  • bash中变量设置的规则

    1. 变量与变量内容以一个 “=” 等号连接。
      例如:var=value

    2. 等号两边都不能有空格的存在。
      例如:var =value 或者 var= value 在或者 va r=value

    3. 变量名只能是英文字母和数字,但是开头字符不能为数字。
      例如: 2var=value

    4. 变量的值若是有空格可以是用双引号将内容包起来。
      例如:var=”value value”

    5. 一个变量值包含另一个变量的值。
      例如:var=”value $var2”

    6. 使用单引号将值里特殊字符转换称一般字符(也可以使用反写杠 “\” 将特殊字符转义)。
      例如:var=’value $var2’,var=value\$var2

    7. 如果还需要设置变量的值为一个命令的输出信息,可以使用反单引号或者双括号包起来。
      例如:var= ` ls -al ` ,var=$(ls -al)

    8. 若有需要的变量需要在子进程中使用,则可以使用export。
      例如:export var

    9. 通常大字符为系统默认变量如(PATH),自行设置的变量可以使用小写,可以方便判断是系统变量还是自定义变量。

    10. 取消变量可以是用unset。
      例如:unset var

环境变量与自定义变量

环境变量与自定义变量也可以称为全局变量与局部便,他们之间的区别就是环境变量可以在子进程中访问(在当前的shell中打开另一个新的shell,那么这个新的shell就是子进程,而执行打开一个新shell的shell就是父进程。例如在shell1中打开一个shell2,那么shell1就是shell2的父进程,而shell2就是shell1的子进程),而局部变量不可以。因为当启动一个shell时操作系统会分一部分内存空间给shell使用,此内存空间可以被子进程中访问。若在父进程利用export命令可以让自定义变量的内容写入到系统分配的内存空间中。当在一个shell里面打开另一个shell时(即启动子进程,父进程进入睡眠状态)。子shell可以将父shell的环境变量所在的内存空间导入到自己的环境变量空间中。

tips:使用env(environment)查看所有的环境变量,set查看所有变量(环境变量与自定义变量)。

特殊变量

  • $(当前shell的ID):“\$”本身也是个变量,这个变量代表的是当前线程的PID(Process ID)。

  • ?(上此执行命令后的回传码):当我们执行某些命令时,这些命令最后都会回传一个数字当作此次执行命令是否成功的标志。执行成功则会返回0,如果执行过程中发生错误就会返回非0的数字。例如使用cd命令切换工作目录,若指定的目录不存在就会返回1,若存在就回返回0。

变量内容的删除,替代与替换

  • 删除:变量删除并不是把指定的变量删除,而是将变量输出时,删除不想要输出的内容。请看如下例子:

这里写图片描述

如果我想将上面practice变量内容中最先开始的/home/jiang/bin:删除。则可以想下面这样写。
这里写图片描述

图中删除变量的语法解释为:

${} : 想要删除字符,这些关键字必须存在。

practice : 表示进行删除操作的变量名。

/*home/jiang/bin: : 这部分表示要删除的部分,删除从/home/jiang/bin之间的内容, *表示/号到home/jiang/bin之间的全部内容全部删除(也包括/)。

#:表示从左向右删除。删除最先匹配到的为止。假设变量内容为/usr/bin/home/bin ,如果指定要删除的为/*bin,就会删除/usr/bin 。剩下/home/bin

##:表示从左向右删除。删除最后匹配到的为止。假设变量内容为 /usr/bin/home/bin ,如果指定要删除的为/*bin, 则变量内容全会被删除。

%:表示从右向左删除。删除最先匹配到的位置,假设变量内容为/usr/bin/home/bin。如果指定内容为/*bin ,则会剩下/usr/bin/home

%%:表示从右向左删除。删除最后匹配到的为止,假设变量内容为/usr/bin/home/bin。如果指定内容为h*bin ,则会剩下/usr/bin

  • 变量测试与替换: 我们可能需要对一个变量进行判断,判断该变量是否存在,如果存在就设置一个值,不存在也设置一个值。就想大多数编程语言都有的分支结构语句一样。

tips: 如果对一个还未定义的变量使用echo命令,则输出的是空白(不是空字符串),而不会报错。

这里写图片描述

图中显示对一个还为定义个变量使用echo命令,结果输出一行空白。然后在使用echo ${username-root} 。然后在对这个变量使用echo命令,然后就输出了图中设置的root。下面是语法解释:

new_var=${test_var-value}

new_var :用于接收“=”右边的值。

${}: 关键字,必须存在。

test_var: 要进行判断的变量。

value: 如果test_var不存在,则将value赋值给new_var。

下面是其他的变量设置方式

这里写图片描述

别名

别名可以帮我们把一个很长的命令缩减到你想要的长度。比如查看目录下文件的ll命令就是一个别名,全写是ls -lh

设置一个别名的语法是:alias 别名='命令',假设只输入h就可以切换到自己帐号所在的目录,那么就可以这样设置 alias h='cd ~'

使用alias命令可以查看所有的别名,而取消一个别名则是unalias。

tips: 名别与变量的区别在与别名相当于创建一个新的命令,而变量需要使用类似于echo命令才能调用变量的内容。

命令的执行顺序

当一个命令被执行时(例如ls),到底是那一个ls被执行。下面是命令的执行顺序:

1. 以相对路径或者绝对路径执行命令,例如“/bin/ls”或“./ls”。

2. 由alias找到该命令来执行。

3. 用bash内置的命令来执行。

4. 通过$PATH遮盖变量的顺序找到第一个命令来执行。 

bash的环境配置

为什么我们什么操作都没有进行,进入到bash就有变量或者别名供我们使用(如变量PATH,HOME。别名ll)?这是因为系统有一些环境配置文件的存在,让bash在启动的时候可以直接读取这些配置文件,以配置bash环境的操作基础。因为Linux是多用户的系统,所有这些配置文件又可以分为整体系统配置文件和个人配置文件。

tips:自定义的变量,别名,在你注销bash之后就会失效。如果你想要保留它们,就得写入到配置文件中。

  • login与non-login shell : 取得bash的方式不同,加载的配置文件也不同。下面是两种取得bash的方式。

    • login shell:取得bash需要完整流程的,就称为login shell。比如,你由tty1~tty6登录,需要输入用户名和密码,此时获得的bash称为login bash。

    • non-login shell: 取得bash的操作不需要输入账户和密码,那么就是获得的是non-login shell。比如你在bash中在新开一个bash那么新开的bash称为 non-login shell。

  • login shell下读取的系统整体配置文件/etc/profile
    这个配置文件可以利用用户的标识符(UID)来决定默认获取的环境变量中会有那些值(比如使用root登录的时候,PATH变量中就会有sbin目录,而其他角色则没有)。Linux上的每个用户使用账户和密码登录的时候,就会读取这个配置文件。另外这个配置文件还会调用下面的配置文件进行设置:

    1. /etc/inputrc: 自定义输入按键的配置文件。
    2. /etc/profile.d/:这个目录下以.sh结尾的文件名,另外还需要r的权限,那么该文件就会被/etc/profile调用。如果你需要帮所有的用户设置一些通用的别名,那么就可以这此目录下新建一个以 .sh为结尾的文件,然后将设置别名的命令写入即可。
  • login shell下读取的系统个人配置文件:~/.bash_profile 或 ~/.bas_login或~/.profile或login bash会读取这三个中的一个,读取顺序是按照介绍的顺序。如果~/.bash_profile存在则其他两个文件不管存不存在,都不会被读取。如果~/.bash_profile不存在才会去读取~/.bash_login。而前两个文件都不存在才会读取~/.profile。

  • 假设你只有/.bash_profile文件,这个文件里面的内容主要使用export命令将PATH变成环境变量。另外还有一个重要的东西就是你可以创建~/bin目录,并把自己创建的可执行文件放置到此文件夹,然后就可以在任何目录下直接输入文件名然后回车执行。之所以能达到这种效果是因为此文件将~/bin目录累加到PATH变量的原因。在最后如果~/.bashrc配置文件存在,则会读取此文件。下面是login shell读取配置文件的整体流程。

这里写图片描述

  • source读取配置文件:上一节所讲到的配置文件都是在取得login shell之后才会读取的配置文件,如果你往某一个配置文件添加了值,通常得重新登录之后才能生效。但source这个命令可以马上将配置文件读取到当前的shell环境中。下面是该命令的语法:

    • source 配置文件名
    • . 配置文件名 (注意有个“.”)
  • non-login shell读取配置文件:non-login shell 只会读取~/.bashrc 这个一个配置文件。这个文件一般用设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次,但只对一个用户有效。

参考

《鸟哥的Linux私房菜》


如此文章有不对地方请多多指正!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值