0%

第10章:认识与学习bash

一、硬件、核心、Shell

操作系统是一组软件,控制整个硬件与管理系统的活动检测。操作系统不能被用户随意操作,若使用不当,则会造成系统崩溃。但是我们总是需要让用户操作系统的,所以就有了应用程序。用户通过应用程序来指挥核心,让核心达成我们所需要的硬件任务。所以应用程序(shell)如同鸡蛋(kernel)的外壳一样。

  • 壳程序的功能只是提供用户操作系统的一个接口,狭义:指令列方面的软件,比如bash;广义:图形接口的软件

二、为何要学文字接口的shell

shell作为应用程序,就有很多版本,/etc/shells文件是可以使用的shells
1571797445(1)
使用者预设的shell是/etc/passwd中的
1571797982(1)

三、变量

1. 变量的用法

  • 变量的取用:echo $variable
  • 变量的设定:变量名=变量值
  • 取消变量:unset 变量名
  • 在bash环境下,未定义的变量名,echo 显示为空

应用: 比如经常去一个目录工作,/a/b/c/d/
则可以work=”/a/b/c/d”
则每次进入工作则用 cd $work
2. 变量查看

  • 查看环境变量:env
  • 查看环境变量和自定义变量:set
  • 自定义变量转换为环境变量:export 变量名
  • 环境变量转换为自定义变量:declare -x 变量名

为什么要将自定义变量转换为环境变量呢?
1574047211(1)
因为bash是shell(应用程序接口)的一种,在此bash下达的指令都是此bash衍生的,也就是子程序。若执行子bash,则环境接口就是子bash的环境,原bash暂停。若想回到父程序,则要将第二个bash结束掉(下达exit或logout)
子程序仅会继承父程序的环境变量,子程序不会继承父程序的自定义变量,所以在原bash下的
自定义变量在子bash下会消失,一直道离开子程序回到父程序,这些自定义变量才会出现。

3. 变量键盘读取、数组与宣告
在2中可以用预设的方式设置变量,也可以用键盘读取的方式来设置变量

  • 键盘读取:read [-pt] 变量名
    变量默认是字符串类型,若想要其他类型(比如数组、数值),则要变量宣告
  • 宣告变量类型:declare [-aixr] 变量名

1574049135(1)

4. 变量内容的删除、取代与替换

四、命令别名与历史命令

1. 命令别名设定:alias、unalias
alias lm=’ls -al | more’
好处:①简化命令长度 ②防止误删操作 比如alias rm=’rm -i’则可以在每次删除时,都提示是否要删除,而不是直接就删除文件。

命令别名与变量区别:命令别名是命令,可以直接使用;变量需要用echo
2. 命令搜寻顺序

  • 以相对/绝对路径执行命令
  • 由alias找到该命令来执行
  • 由bash内建的(builtin)指令来执行
  • 透过$PATH这个变量的顺序搜寻到的第一个指令来执行
    1574059365(1)
    所以有了ls与/bin/ls执行结果不同的情况

    五、数据流重定向

    将原本命令执行后输出在屏幕上内容,输出到文件或者装置中

1. 标准输出:代码为0 >或者>> 区别:>会覆盖掉原文件内容
将原本输出在屏幕的,输出到文件中
比如:ls >> a.txt
2. 标准错误输出: 代码为1,>或者>>

3. 标准输入: <或<< <<是指定键盘输入终止符
将原本在键盘输入的,由文件输入(必须是文件)
cat > b.txt < a.txt
键盘输入:
1574064087(1)
4. 命令执行的判断依据:;&& ||

  • 不考虑命令相关性cmd;cmd(不管命令是否执行成功)
  • 考虑命令相关性&&:前面正确执行,后面才会执行
  • 考虑命令相关性||:短路原理 前执行成功,后不会执行;前错误,后才执行
    举例:以ls 测试/a/b是否存在,若存在则显示“exist”;若不存在,则显示“not exist”
    1574065483(1)

    六、管道命令(pipe)

    管道与上述五.4不同 管道是前一个命令的输出是下一个命令的输入;五.4命令间是不存在相互影响的
    1574066264(1)