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 [arg]... 范例: 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[x]=1 a[y]=2 ${name[0]} <-- 获取第0个元素 ${#name[*]} <-- 阵列的长度 ${!name[*]} <-- 阵列的keys ${name[*]} <-- 阵列的values unset name <-- 删除整个阵列 unset name[0] <-- 删除阵列中的一个元素 5. 展开 (2),(kw: EXPANSION) shell 在执行命令之前,会对读到的命令行字符串做一系列的展开操作,常见的展开操作有: 1. 大括号展开 (kw: Brace Expansion) {1..10},{1..10..2},{a..z} d{1,2,3} -> d1 d2 d3 $ cp -v /tmp/a/b/c/deep{,2} ‘/tmp/a/b/c/deep’ -> ‘/tmp/a/b/c/deep2’ 2. 波浪号展开 (kw: Tilde Expansion) ~: 当前用户的家目录 ~user:指定用户的家目录 ~+: 当前工作目录 ~-: 上一个工作目录 3. 参数展开 (kw: Parameter Expansion) $,${name} ${name:-default} <-- 默认值 ${name:offset} <-- 截取字符串 ${name:offset:length} <-- 截取一定长度的字符串 ${#name} <-- 计算字符串长度 ${name#word} <-- 删除字符串头部 ${name%word} <-- 删除字符串尾部 ${name/pattern/string} <-- 字符串替换 ${name^pattern} <-- 转换成大写 ${name,pattern} <-- 转换成小写 4. 命令替换 (kw: Command Substitution) $(cmd list) <-- 当前应该使用这个 `cmd list` <-- 过时语法 5. 算术展开 (kw: Arithmetic Expansion) $((expression)) <-- 当前应该使用这个 $[expression] <-- 过时语法 6. 进程替换 (kw: Process Substitution) <(cmd list) >(cmd list) 7. 路径名展开 (kw: Pathname Expansion) *,?,[] 能展开则展开,不能展开则保持原样 6. 重定向 (1.5),(kw: REDIRECTION) 在一个命令执行之前,它的输入和输出可能被shell重定向,重定向操作有以下功能: 重定向输入 (kw: Redirecting Input,Here Documents,Here Strings) wc -l < file cmd <<EOF .. EOF cmd <<< "string" 重定向输出 (kw: Redirecting Output) 复制文件描述符 (kw: Duplicating File Descriptors) exec 4>&3 <-- 把3 复制成4 移动文件描述符 (kw: Moving File Descriptors) exec 4>&3- <-- 把3 移动到4 关闭文件描述符 exec 3>&- <-- 关闭3 以读写方式打开文件描述符 (kw: Opening File Descriptors for Reading and Writing) exec 3<>file <-- 以读写形式打开 0 stdin 1 stdout 2 stderr 7. 算术运算 (0.5) bash shell 支持整数算术运算 1. ((expression)) (kw: ARITHMETIC EVALUATION) 2. $((expression)) (kw: Arithmetic Expansion) 3. 小数运算 bc,python,awk
8. 简单命令的展开 (0.5),(kw: SIMPLE COMMAND EXPANSION) shell 执行简单命令时,在实际执行之前,会做以下操作: 1. 取出变量赋值和重定向部分 2. 对余下部分做展开操作 3. 执行重定向操作 4. 执行变量赋值操作 简单命令展开完后,如果展开的结果中有命令名,则流程去到“命令的执行”阶段。 9. 命令的执行 (1),(kw: COMMAND EXECUTION) 1. 如果命令名不包含斜杠,就按顺序搜索命令: 1. 函数 2. 内部命令 3. 搜索PATH 中的目录 2. 如果搜索成功,或者命令名包含了斜杠,则开始执行。 3. 如果搜索失败,或者程序文件不存在,则返回127。 10. 命令的执行环境 (0.5),(kw: COMMAND EXECUTION ENVIRONMENT) 1. 打开的文件 2. 当前工作目录 3. umask 4. 信号trap -->进程通讯 5. shell 变量 6. shell 函数 7. shell 的功能选项(set,shopt) set -o vim/emacs 8. shell 別名 9. 各种进程ID ($$,$PPID) 11. 环境变量 (0.5),(kw: ENVIRONMENT) 当一个命令被执行的时候,会有一个字符串阵列(列表)传给它,这个阵列叫做“环境”,也叫“环境变量”。 shell 的环境变量可以传给子进程。设置shell 的环境变量的命令: 1. export export time <-- 把time 设置成环境变量 export -n time <-- 使time 编程非环境变量 2. declare declare -x time <-- 把time 设置成环境变量 declare +x time <-- 使time 编程非环境变量 12. shell 的内部命令 (4.5),(kw: SHELL BUILTIN COMMANDS) shell的内部命令默认在当前进程执行,常用的有 01. : 空命令 02. .,source 点命令(source)把文件里面的代码读到“当前进程”中执行。 03. break,continue break <-- 结束整个循环 continue <-- 结束当前循环,进入下一轮循环 04. cd,pwd cd <-- 必须是内部命令 05. declare,export,readonly,local 06. set,unset,shopt -》set改变shell的开关 07. echo,read,printf 08. exec 09. exit,return 10. kill,trap 11. shift 12. test,[ 13. wait (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- twitter-bootstrap – 选择在bootstrap模式中显示的插件不能
- angular – 使用表单构建器的自定义表单控件属性
- 4.9、Bootstrap V4自学之路------组件---提示
- 使用谓词从scala可变地图中删除元素的正确方法是什么?
- angularjs – 绑定类切换到窗口滚动事件
- angularjs – 角度平移静态加载器文件PascalPrecht
- bash – 我如何可以做一个进度条(cp复制目录)?
- 今天试了试返回dataset的webservice
- scala – 在Option.isEmpty和Option.get上使用Option.map有
- 在Scala集合中查找和替换项目