重新学习Bash脚本(一)

2019-05-17

重新学习Bash脚本(一)

shell,即操作系统的CLI界面,是接收用户输入,调用操作系统内核功能的交互环境。

bash是目前linux上使用最普遍的shell,曾经还有cshell, zshell等等shell,不过都淘汰了。虽然我不喜欢bash的大奇葩语法、看起来像乱码的命令、啥都用字符串传来传去的习惯,但没办法,普及率高啊。就像ie用户多也就需要前端来兼容ie,其实前端人员一个都不喜欢ie。

我非常看好powershell成为新一代跨平台的shell,面向对象、跨平台、强弱类型支持、命令语义化、在线帮助文档等等牛逼功能,用起来和写脚本都比bash好太多了。微软加油啊,为民除害天经地义。

黑屁有点多,现在开始学习bash。

Bash Terminal功能

  • history:上下键寻找历史命令
  • tab:自动补全
  • ctrl+a/ctrl+e:将光标移动至最前面/最后面
  • ctrl+u/ctrl+k:向前/向后删除命令串

变量

  • 取值:${}运算符,用echo命令打印出来。

    $ echo ${PATH} #建议使用这种,为了和命令取值分开
    $ echo $PATH
    
  • 赋值:=运算符,赋值为字符串

    • 若有空格,可以用""''包裹起来
    • 双引号中的$取值会生效,单引号中不会生效
    • 对特殊字符可以用\转义
    • 命令取值用$()
    $ version=$(uname -r)
    $ echo ${version}
    4.15.0-30deepin-generic
    $ version=${version}:QE
    4.15.0-30deepin-generic:QE
    
  • 删除变量 使用unset

  • 使用

    $ cd ${HOME}
    $ cd $(pwd)/..
    
  • read命令-用变量接收输入

    $ read -p input: var
    input:123456
    $ echo ${var}
    123456
    

环境变量

  • 环境变量是什么:在每个shell seesion中都有的变量,作用于一些命令和程序的变量。
  • 将普通变量导出(成为环境变量)export
  • 查看所有的环境变量:env;同时这个指令也可以设置一些环境变量去运行命令,而不影响当前的环境变量
  • 比较重要的环境变量:
    • HOME 相当于~
    • SHELL 如果用bash就是/bin/bash
    • PATH 命令/文件查找路径
    • RANDOM 系统随机数种子
    • PS1:提示字符格式,可以自己设置
    • ?:上一条命令的返回值

变量类型

之前操作的变量都是默认类型:字符串,实际上字符串也是Bash中最常用的数据类型,大部分命令的接收参数和返回值都是字符串。

然而Bash中是有别的数据类型的,数据类型通过declare命令声明类型变量,共有:

  • -a: Array
  • -i: Integer
  • -x: Export (环境变量字符串)
  • -r: readonly

其中数字类型会对四则运算有功能,不再举例。

数组类型用法:

$ declare -a arr
$ arr[3]=hello
$ echo ${arr[3]}
hello

Bash执行环境

  • Bash的指令执行顺序基本上可以概括为:

    • 若为以路径的命令,比如./a.out,则直接调用
  • 若否,则查找顺序为:别名=>bash内置命令=>$PATH下的可执行文件

  • 别名:创建一个命令(为一个命令取别名)

    alias命令和unalias命令

    $ alias cls='clear' # cls是PowerShell的清屏命令,拿来举个例子
    $ cls
    
  • 命令历史:除了按上下键,还有一个命令记录bash的历史,就是history命令,命令还支持导入/导出命令记录

    $ history 10
    # 输出最近10条记录
    

    还有一个命令!,意思为执行第n条指令(由history命令查出的序号)

    $ !!	#执行上一条指令
    $ !1577 #执行1577指令
    $ !vi   #执行第一个开头为vi的指令,比如vim
    

    历史命令会存入~/.bash_history文件中。

  • 环境配置文件

    • bash启动欢迎信息:/etc/issue

    • profile文件:

      每次启动bash的时候都会先去执行的文件,可以在里面设置一些别名、环境变量、提示符等等环境信息。

      这个不用的发行版区别还挺大的,但大部分都有:/etc/profile这个配置文件,一般来说改这个是可以作用到全局的。我的deepin改/etc/bash.bashrc这个也行。

  • tty相关

    • tty:虚拟终端,在一个显示器上虚拟多终端,用于多任务,比如第一个终端在下载东西,换到第二个终端继续敲命令。
    • 启动不同的tty环境:alt+ctrl+[f1~f6]
    • 设置tty相关设定,比如快捷键,行列长度等:stty命令(其实真的用的超级少)