h0945466 发表于 2018-8-18 06:52:12

bash Shell 总结《一》

  从解决问题开始(1):
  1. 计算文件unix 中单词UNIX, Ritchie, Thompson 出现的次数
  2. 计算文件unix 中所有单词出现的次数
  3. 写成一个脚本(有什么好处?可重用,可调整参数,封装起来方便使用)
  4. 给脚本添加选项和参数(忽略大小写,排序)
  5. 把脚本放到适当位置,使系统上所有用户都可以使用 (PATH 变量)
  6. 添加命令別名,方便调用 (alias)
  1. shell 是什么,它能做什么
  shell 是一个程序,在文件系统里的位置一般是 /bin/bash,shell 程序与其它程序一样都是程序,不同的是它的功能,它的功能是管理別的程序。wget 可以下载文件,vim 可以编辑文件,useradd 可以创建用户,而shell 可以管理这些完成具体任务的应用程序。
  用户不会直接使用操作系统,用户使用的是应用程序,用户通过应用程序间接地使用操作系统(内核)来完成具体的任务。shell 就好像内核外面的一层壳 (英文叫做shell),用户通过这层壳来和内核交互,管理各种应用程序。
  shell 是用户和内核交互的一种渠道,此外它还有一个突出的特征就是能够组合各种各样的应用程序,完成复杂强大的功能,仿佛“胶水”一样。
  2. shell 脚本是什么
  shell 脚本是一种程序,这种程序由shell 程序解释执行,有別於需要编译才能执行的二进制程序。shell 程序(就是shell 解释器)是二进制程序,shell 脚本是文本文件。与shell 脚本类似的程序有Python 脚本,PHP 脚本等。这些所谓的“脚本”都有共同的地方,它们都是按照解释器(通常是二进制程序)的语法编写的文本文件。
  3. 除了bash shell,还有別的吗?
  第一个UNIX shell,osh, 叫做V6 shell,Ken Thompson 写的,缺少脚本功能,它的目的是做命令行解释,就是启动程序,观察结果。
  1977, Bourne shell, 能用于命令行解释和脚本之中,提供了流程控制,循环,变量等功能。Bourne shell 是shell 发展史上一个标记性的成果,后续许多的shell 皆衍生它。
  C shell, 语法像C 语言,它引入了命令历史的功能。
  Korn shell,向后兼容Bourne shell,支持小数计算。
  Bourne-Again shell, 就是bash,是一个GNU 项目,向后兼容Bourne shell,许多Bourne shell 的脚本可以不经修改就直接用bash 来执行。
  4. shell 脚本的结构和运行方式
  结构:
  1. 首行
  2. 代码
  3. 注释
  运行方式:
  1. 直接运行解释器,以脚本为参数。
  2. 给脚本添加执行权限,直接执行脚本本身。
  man bash
  1. shell 的工作原理 (1)
  内核shell用户
  父进程 fork --> wait
  子进程 exec --> exit
  相关man文档:
  fork(2)
  clone(2)
  execve(2)
  exit_group(2)
  exit4(2)
  strace(1) -->strace -e
  2. shell 语法 (2)
  1. 简单命令 (kw: Simple Commands)
  基本形式:command ...
  范例:
  cd
  ls -l
  cp /data/log /backup/log
  2. 管道 (kw: Pipelines)
  基本形式:cmd1 | cmd2 | cmd3   -->管道+小命令=复杂命令
  左边命令的标准输出作为右边命令的标准输入
  用|&代替|,可以把标准错误也一起传给右边
  管道中的每一个命令都在子进程中执行
  管道中的命令同时运行
  管道的返回状态是管道最右边的命令的返回状态
  范例:
  ls /students|wc -l
  ip a| grep -w inet
  3. 列表 (kw: Lists)
  一系列的管道就是列表
  列表中用于分割管道的符合有:
  ;: 命令按顺序从左到右执行
  &: 命令同时执行
  &&: 左边成功才执行右边
  ||: 左边失败才执行右边
  列表的结尾可以有; &,如果是&,则最右边的管道放在后台执行
  4. 复合命令 (kw: Compound Commands)
  (list) 列表作为一个整体在子进程中执行
  { list; } 列表作为一个整体在当前进程中执行
  ((expression)) 算术运算
  ((n++))
  ((total=$first + $last))
  [[ expression ]]当表达式为真时,返回0,否则返回非0,支持正则
  if, case, for, while 这些都是shell的流程控制指令
  3. 引用 (1), (kw: QUOTING)
  shell 中的引用符号用于去除特殊字符的特殊意义
  1. 双引号 不能转义 $
  2. 单引号 转义所有的符合,除了'本身
  3. 反斜杠 单个字符
  4. 参数 (2), (kw: PARAMETERS)
  Shell 参数是存放“值”的“东西”,它可以是一个名字,一个数字,或者是一些特殊符号。
  1. 变量
  2. 位置参数 (kw: Positional Parameters)
  3. 特殊参数 (kw: Special Parameters)
  $*: 所有位置参数合并成的一个字符串
  $@: 所有位置参数,如果放在双引号里面,则保存参数的边界
  4. shell 内置变量 (kw: Shell Variables)
  5. 阵列 (kw: Arrays)
  a=(e1 e2 e3)
  declare -A a
  a=1
  a=2
  ${name}
页: [1]
查看完整版本: bash Shell 总结《一》