├── README.md ├── SUMMARY.md ├── _config.yml ├── docs ├── bash内置命令.md ├── bash内置命令 │ ├── alias.md │ ├── buildin.md │ ├── cd.md │ ├── command.md │ ├── compgen.md │ ├── declare.md │ ├── echo.md │ ├── exec.md │ ├── exit.md │ ├── false.md │ ├── getopts.md │ ├── help.md │ ├── history.md │ ├── image │ │ ├── 20191109_110117_52.png │ │ ├── 20191109_110253_80.png │ │ ├── 20191109_110423_19.png │ │ ├── 20191109_110718_99.png │ │ ├── 20191109_111412_75.png │ │ └── 20191109_111452_41.png │ ├── let.md │ ├── pwd.md │ ├── read.md │ ├── readonly.md │ ├── set.md │ ├── shift.md │ ├── shopt.md │ ├── test.md │ ├── true.md │ ├── ulimit.md │ └── umask.md ├── gawk.md ├── grep.md ├── image │ ├── 1528730943495.png │ ├── 1529669130178.png │ ├── 1529669225210.png │ ├── 1529669248468.png │ ├── 1529669301175.png │ ├── 1529669359364.png │ ├── 1529669378625.png │ ├── 1529669437044.png │ ├── 1529672770386.png │ ├── 1529672997163.png │ ├── 1529673049790.png │ ├── 1529673328533.png │ ├── 1529673349988.png │ ├── 20190916_220300_91.png │ ├── 20190916_220639_49.png │ ├── 20190916_220904_75.png │ ├── 20190916_222255_96.png │ ├── 20191109_120612_34.png │ ├── 20191109_121028_98.png │ ├── 20191109_121314_11.png │ ├── 20191109_121331_32.png │ ├── 20191109_121748_30.png │ ├── 20191109_121832_21.png │ ├── 20191109_122013_36.png │ ├── 20191109_122027_46.png │ └── 20191109_122239_68.png ├── sed.md ├── shell原理.md ├── shell原理 │ └── 命令的结束状态.md ├── shell简介.md ├── 函数.md ├── 数据类型.md ├── 数据类型 │ ├── 字符串.md │ └── 字符串 │ │ ├── image │ │ ├── 20191109_104652_17.png │ │ ├── 20191109_122817_38.png │ │ ├── 20191109_152632_24.png │ │ ├── 20191109_153249_26.png │ │ ├── 20191109_153302_69.png │ │ └── 20191109_153636_57.png │ │ ├── 字符串截取与拼接.md │ │ └── 字符串替换.md ├── 文本三剑客.md ├── 文本三剑客 │ ├── gawk.md │ ├── grep.md │ └── sed.md ├── 文本编辑器.md ├── 文本编辑器 │ ├── emacs.md │ ├── nano.md │ └── vim.md ├── 正则表达式与模式匹配.md ├── 流程控制.md ├── 流程控制 │ ├── select命令.md │ ├── 判断.md │ ├── 判断 │ │ ├── case.md │ │ ├── if.md │ │ └── image │ │ │ ├── 20191108_170205_62.png │ │ │ ├── 20191108_171238_96.png │ │ │ ├── 20191108_171444_95.png │ │ │ ├── 20191108_172226_42.png │ │ │ ├── 20191108_172707_11.png │ │ │ ├── 20191108_183550_36.png │ │ │ ├── 20191108_185908_16.png │ │ │ ├── 20191108_190535_39.png │ │ │ ├── 20191108_191345_88.png │ │ │ ├── 20191108_191547_58.png │ │ │ ├── 20191108_192645_58.png │ │ │ ├── 20191108_193052_52.png │ │ │ ├── 20191108_193323_51.png │ │ │ ├── 20191108_193939_57.png │ │ │ ├── 20191109_112408_17.png │ │ │ ├── 20191109_124541_22.png │ │ │ ├── 20191109_124733_17.png │ │ │ ├── 20191109_125634_74.png │ │ │ ├── 20191109_131624_29.png │ │ │ └── 20191109_143132_98.png │ ├── 循环.md │ └── 循环 │ │ ├── break.md │ │ ├── continue.md │ │ ├── for.md │ │ ├── image │ │ ├── 20191111_200731_64.png │ │ ├── 20191111_200819_66.png │ │ ├── 20191111_200841_60.png │ │ └── 20191114_163825_68.png │ │ ├── until.md │ │ └── while.md ├── 环境变量.md └── 环境变量 │ ├── image │ ├── 20191109_104652_17.png │ ├── 20191109_122817_38.png │ ├── 20191109_152632_24.png │ ├── 20191109_153249_26.png │ ├── 20191109_153302_69.png │ └── 20191109_153636_57.png │ ├── shell保留关键字.md │ ├── 位置参数.md │ ├── 删除变量.md │ ├── 变量类型.md │ ├── 变量赋值.md │ ├── 标准变量.md │ ├── 特殊变量.md │ └── 预定义变量.md └── image ├── 20200127_164206_47.png └── 20210708_224801_51.png /README.md: -------------------------------------------------------------------------------- 1 | # Linux Shell编程 2 | 3 | ![20200127_164206_47](image/20200127_164206_47.png) 4 | 5 | ``` 6 | Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 7 | 8 | Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 9 | 10 | Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。 11 | ``` 12 | 13 | 14 | 15 | 16 | ## 本仓库内容 17 | 18 | 1. shell脚本编程学习笔记 19 | 20 | ``` 21 | Something I hope you know before go into the coding~ 22 | First, please watch or star this repo, I'll be more happy if you follow me. 23 | Bug report, questions and discussion are welcome, you can post an issue or pull a request. 24 | ``` 25 | 26 | ## 相关站点 27 | 28 | * GitBook: 29 | * GitHub: 30 | * GitPage: 31 | 32 | ## 参考书目 33 | 34 | * 《Linux命令行与Shell脚本编程大全》 35 | * 《精通UNIX.shell脚本编程》 36 | * 《实战LINUX_SHELL编程与服务器管理》 37 | * 《Shell脚本编程诀窍——适用于Linux、Bash等》 38 | 39 | 40 | ## 目录 41 | 42 | * [shell简介](docs/shell简介.md) 43 | * [shell原理](docs/shell原理.md) 44 | * [命令的结束状态](docs/shell原理/命令的结束状态.md) 45 | * [环境变量](docs/环境变量.md) 46 | * [变量类型](docs/环境变量/变量类型.md) 47 | * [shell保留关键字](docs/环境变量/shell保留关键字.md) 48 | * [变量赋值](docs/环境变量/变量赋值.md) 49 | * [位置参数](docs/环境变量/位置参数.md) 50 | * [删除变量](docs/环境变量/删除变量.md) 51 | * [预定义变量](docs/环境变量/预定义变量.md) 52 | * [标准变量](docs/环境变量/标准变量.md) 53 | * [特殊变量](docs/环境变量/特殊变量.md) 54 | * [数据类型](docs/数据类型.md) 55 | * [字符串](docs/数据类型/字符串.md) 56 | * [字符串截取与拼接](docs/数据类型/字符串/字符串截取与拼接.md) 57 | * [bash内置命令](docs/bash内置命令.md) 58 | * [alias](docs/bash内置命令/alias.md) 59 | * [buildin](docs/bash内置命令/buildin.md) 60 | * [compgen](docs/bash内置命令/compgen.md) 61 | * [declare](docs/bash内置命令/declare.md) 62 | * [exec](docs/bash内置命令/exec.md) 63 | * [echo](docs/bash内置命令/echo.md) 64 | * [exit](docs/bash内置命令/exit.md) 65 | * [set](docs/bash内置命令/set.md) 66 | * [let](docs/bash内置命令/let.md) 67 | * [test](docs/bash内置命令/test.md) 68 | * [history](docs/bash内置命令/history.md) 69 | * [pwd](docs/bash内置命令/pwd.md) 70 | * [cd](docs/bash内置命令/cd.md) 71 | * [readonly](docs/bash内置命令/readonly.md) 72 | * [command](docs/bash内置命令/command.md) 73 | * [shift](docs/bash内置命令/shift.md) 74 | * [true](docs/bash内置命令/true.md) 75 | * [false](docs/bash内置命令/false.md) 76 | * [umask](docs/bash内置命令/umask.md) 77 | * [ulimit](docs/bash内置命令/ulimit.md) 78 | * [getopts](docs/bash内置命令/getopts.md) 79 | * [shopt](docs/bash内置命令/shopt.md) 80 | * [read](docs/bash内置命令/read.md) 81 | * [help](docs/bash内置命令/help.md) 82 | * [流程控制](docs/流程控制.md) 83 | * [判断](docs/流程控制/判断.md) 84 | * [if](docs/流程控制/判断/if.md) 85 | * [case](docs/流程控制/判断/case.md) 86 | * [循环](docs/流程控制/循环.md) 87 | * [for](docs/流程控制/循环/for.md) 88 | * [while](docs/流程控制/循环/while.md) 89 | * [until](docs/流程控制/循环/until.md) 90 | * [continue](docs/流程控制/循环/continue.md) 91 | * [break](docs/流程控制/循环/break.md) 92 | * [select命令](docs/流程控制/select命令.md) 93 | * [函数](docs/函数.md) 94 | * [正则表达式与模式匹配](docs/正则表达式与模式匹配.md) 95 | * [文本三剑客](docs/文本三剑客.md) 96 | * [sed](docs/文本三剑客/sed.md) 97 | * [gawk](docs/文本三剑客/gawk.md) 98 | * [grep](docs/文本三剑客/grep.md) 99 | * [文本编辑器](docs/文本编辑器.md) 100 | * [vim](docs/文本编辑器/vim.md) 101 | * [nano](docs/文本编辑器/nano.md) 102 | * [emacs](docs/文本编辑器/emacs.md) 103 | 104 | 105 | 106 | ## 总结 107 | 108 | 1. 基础永远值得花费90%的精力去学习加强。厚积而薄发~ 109 | 2. 实践的重要性 110 | 111 | 112 | ## 常用套路snip 113 | 114 | 115 | ### if判断 116 | 117 | * [[ ... && ... && ... ]] 和 [ ... -a ... -a ...] 不一样,[[ ]] 是逻辑短路操作,而 [ ] 不会进行逻辑短路 118 | * [[ ... ]]进行算术扩展,而[ ... ]不做 119 | 120 | ``` 121 | if [ X"${var}" != "X1" ];then 122 | ... 123 | fi 124 | ``` 125 | 126 | && and 判断 127 | 128 | ``` 129 | if [ X"${var}" != "X1" -a X"${var2}" != "X2" ];then 130 | ... 131 | fi 132 | ``` 133 | 134 | ``` 135 | if [[ X"${var}" != "X1" and X"${var2}" != "X2" ]];then 136 | ... 137 | fi 138 | ``` 139 | 140 | ``` 141 | if [[ X"${var}" != "X1" ]] and [[ X"${var2}" != "X2" ]];then 142 | ... 143 | fi 144 | ``` 145 | 146 | || or 判断 147 | 148 | ``` 149 | if [ X"${var}" != "X1" -o X"${var2}" != "X2" ];then 150 | ... 151 | fi 152 | ``` 153 | 154 | ``` 155 | if [[ X"${var}" != "X1" || X"${var2}" != "X2" ]];then 156 | ... 157 | fi 158 | ``` 159 | 160 | ``` 161 | if [[ X"${var}" != "X1" ]] or [[ X"${var2}" != "X2" ]];then 162 | ... 163 | fi 164 | ``` 165 | 166 | ![20210708_224801_51](image/20210708_224801_51.png) 167 | 168 | 169 | ### 循环 170 | 171 | 172 | 死循环写法 173 | 174 | ``` 175 | while [ 1 ];do 176 | ... 177 | done 178 | ``` 179 | 180 | 181 | 182 | 183 | --- 184 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | * [读我](README.md) 4 | * [shell简介](docs/shell简介.md) 5 | * [shell原理](docs/shell原理.md) 6 | * [命令的结束状态](docs/shell原理/命令的结束状态.md) 7 | * [环境变量](docs/环境变量.md) 8 | * [变量类型](docs/环境变量/变量类型.md) 9 | * [shell保留关键字](docs/环境变量/shell保留关键字.md) 10 | * [变量赋值](docs/环境变量/变量赋值.md) 11 | * [位置参数](docs/环境变量/位置参数.md) 12 | * [删除变量](docs/环境变量/删除变量.md) 13 | * [预定义变量](docs/环境变量/预定义变量.md) 14 | * [标准变量](docs/环境变量/标准变量.md) 15 | * [特殊变量](docs/环境变量/特殊变量.md) 16 | * [数据类型](docs/数据类型.md) 17 | * [字符串](docs/数据类型/字符串.md) 18 | * [字符串截取与拼接](docs/数据类型/字符串/字符串截取与拼接.md) 19 | * [字符串替换](docs/数据类型/字符串/字符串替换.md) 20 | * [bash内置命令](docs/bash内置命令.md) 21 | * [alias](docs/bash内置命令/alias.md) 22 | * [buildin](docs/bash内置命令/buildin.md) 23 | * [compgen](docs/bash内置命令/compgen.md) 24 | * [declare](docs/bash内置命令/declare.md) 25 | * [exec](docs/bash内置命令/exec.md) 26 | * [echo](docs/bash内置命令/echo.md) 27 | * [exit](docs/bash内置命令/exit.md) 28 | * [set](docs/bash内置命令/set.md) 29 | * [let](docs/bash内置命令/let.md) 30 | * [test](docs/bash内置命令/test.md) 31 | * [history](docs/bash内置命令/history.md) 32 | * [pwd](docs/bash内置命令/pwd.md) 33 | * [cd](docs/bash内置命令/cd.md) 34 | * [readonly](docs/bash内置命令/readonly.md) 35 | * [command](docs/bash内置命令/command.md) 36 | * [shift](docs/bash内置命令/shift.md) 37 | * [true](docs/bash内置命令/true.md) 38 | * [false](docs/bash内置命令/false.md) 39 | * [umask](docs/bash内置命令/umask.md) 40 | * [ulimit](docs/bash内置命令/ulimit.md) 41 | * [getopts](docs/bash内置命令/getopts.md) 42 | * [shopt](docs/bash内置命令/shopt.md) 43 | * [read](docs/bash内置命令/read.md) 44 | * [help](docs/bash内置命令/help.md) 45 | * [流程控制](docs/流程控制.md) 46 | * [判断](docs/流程控制/判断.md) 47 | * [if](docs/流程控制/判断/if.md) 48 | * [case](docs/流程控制/判断/case.md) 49 | * [循环](docs/流程控制/循环.md) 50 | * [for](docs/流程控制/循环/for.md) 51 | * [while](docs/流程控制/循环/while.md) 52 | * [until](docs/流程控制/循环/until.md) 53 | * [continue](docs/流程控制/循环/continue.md) 54 | * [break](docs/流程控制/循环/break.md) 55 | * [select命令](docs/流程控制/select命令.md) 56 | * [函数](docs/函数.md) 57 | * [正则表达式与模式匹配](docs/正则表达式与模式匹配.md) 58 | * [处理用户输入](docs/处理用户输入.md) 59 | * [处理用户输入](docs/处理用户输入.md) 60 | * [文本三剑客](docs/文本三剑客.md) 61 | * [sed](docs/文本三剑客/sed.md) 62 | * [gawk](docs/文本三剑客/gawk.md) 63 | * [grep](docs/文本三剑客/grep.md) 64 | * [文本编辑器](docs/文本编辑器.md) 65 | * [vim](docs/文本编辑器/vim.md) 66 | * [nano](docs/文本编辑器/nano.md) 67 | * [emacs](docs/文本编辑器/emacs.md) 68 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /docs/bash内置命令.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [bash内置命令](#bash内置命令) 4 | - [如何查看所有bash内置命令](#如何查看所有bash内置命令) 5 | - [判断命令是内部的(内置)还是外部的](#判断命令是内部的(内置)还是外部的) 6 | - [内建命令帮助信息](#内建命令帮助信息) 7 | 8 | 9 | # bash内置命令 10 | 11 | ## 如何查看所有bash内置命令 12 | 13 | 方法一: 通过help命令查看 14 | 15 | ![20191109_120612_34](image/20191109_120612_34.png) 16 | 17 | ``` 18 | job_spec [&] 19 | history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...] 20 | (( expression )) 21 | if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi 22 | . filename [arguments] 23 | jobs [-lnprs] [jobspec ...] or jobs -x command [args] 24 | : 25 | kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] 26 | [ arg... ] 27 | let arg [arg ...] 28 | [[ expression ]] 29 | local [option] name[=value] ... 30 | alias [-p] [name[=value] ... ] 31 | logout [n] 32 | bg [job_spec ...] 33 | mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array] 34 | bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq] [-x keyseq:shell-command] [keyseq:read> 35 | popd [-n] [+N | -N] 36 | break [n] 37 | printf [-v var] format [arguments] 38 | builtin [shell-builtin [arg ...]] 39 | pushd [-n] [+N | -N | dir] 40 | caller [expr] 41 | pwd [-LP] 42 | case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac 43 | read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]> 44 | cd [-L|[-P [-e]]] [dir] 45 | readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array] 46 | command [-pVv] command [arg ...] 47 | readonly [-aAf] [name[=value] ...] or readonly -p 48 | compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filt> 49 | return [n] 50 | complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C comma> 51 | select NAME [in WORDS ... ;] do COMMANDS; done 52 | compopt [-o|+o option] [-DE] [name ...] 53 | set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...] 54 | continue [n] 55 | shift [n] 56 | coproc [NAME] command [redirections] 57 | shopt [-pqsu] [-o] [optname ...] 58 | declare [-aAfFgilrtux] [-p] [name[=value] ...] 59 | source filename [arguments] 60 | dirs [-clpv] [+N] [-N] 61 | suspend [-f] 62 | disown [-h] [-ar] [jobspec ...] 63 | test [expr] 64 | echo [-neE] [arg ...] 65 | time [-p] pipeline 66 | enable [-a] [-dnps] [-f filename] [name ...] 67 | times 68 | eval [arg ...] 69 | trap [-lp] [[arg] signal_spec ...] 70 | exec [-cl] [-a name] [command [arguments ...]] [redirection ...] 71 | true 72 | exit [n] 73 | type [-afptP] name [name ...] 74 | export [-fn] [name[=value] ...] or export -p 75 | typeset [-aAfFgilrtux] [-p] name[=value] ... 76 | false 77 | ulimit [-SHacdefilmnpqrstuvx] [limit] 78 | fc [-e ename] [-lnr] [first] [last] or fc -s [pat=rep] [command] 79 | umask [-p] [-S] [mode] 80 | fg [job_spec] 81 | unalias [-a] name [name ...] 82 | for NAME [in WORDS ... ] ; do COMMANDS; done 83 | unset [-f] [-v] [name ...] 84 | for (( exp1; exp2; exp3 )); do COMMANDS; done 85 | until COMMANDS; do COMMANDS; done 86 | function name { COMMANDS ; } or name () { COMMANDS ; } 87 | variables - Names and meanings of some shell variables 88 | getopts optstring name [arg] 89 | wait [id] 90 | hash [-lr] [-p pathname] [-dt] [name ...] 91 | while COMMANDS; do COMMANDS; done 92 | help [-dms] [pattern ...] 93 | { COMMANDS ; } 94 | ``` 95 | 96 | 方法二:通过compgen命令查看 97 | 98 | 99 | ![20191109_122239_68](image/20191109_122239_68.png) 100 | 101 | ``` 102 | [root@vm ~]# compgen -b 103 | . 104 | : 105 | [ 106 | alias 107 | bg 108 | bind 109 | break 110 | builtin 111 | caller 112 | cd 113 | command 114 | compgen 115 | complete 116 | compopt 117 | continue 118 | declare 119 | dirs 120 | disown 121 | echo 122 | enable 123 | eval 124 | exec 125 | exit 126 | export 127 | false 128 | fc 129 | fg 130 | getopts 131 | hash 132 | help 133 | history 134 | jobs 135 | kill 136 | let 137 | local 138 | logout 139 | mapfile 140 | popd 141 | printf 142 | pushd 143 | pwd 144 | read 145 | readarray 146 | readonly 147 | return 148 | set 149 | shift 150 | shopt 151 | source 152 | suspend 153 | test 154 | times 155 | trap 156 | true 157 | type 158 | typeset 159 | ulimit 160 | umask 161 | unalias 162 | unset 163 | wait 164 | ``` 165 | 166 | ## 判断命令是内部的(内置)还是外部的 167 | 168 | 方法一: type命令 169 | 170 | ``` 171 | [root@vm ~]# type type 172 | type is a shell builtin 173 | ``` 174 | 175 | * type命令本身也是bash内建命令 176 | * ```help type```查看内置命令type的帮助信息 177 | 178 | ![20191109_121748_30](image/20191109_121748_30.png) 179 | 180 | ![20191109_121028_98](image/20191109_121028_98.png) 181 | 182 | ![20191109_122027_46](image/20191109_122027_46.png) 183 | 184 | 方法二: command命令 185 | 186 | * 如果是內置命令,command默认没有输出,可以添加-V参数显示详细信息 187 | * ```help command``` 查看内置命令command的帮助信息 188 | 189 | ![20191109_121832_21](image/20191109_121832_21.png) 190 | 191 | ![20191109_122013_36](image/20191109_122013_36.png) 192 | 193 | ## 内建命令帮助信息 194 | 195 | * 内建命令通过help(内建命令)来获取帮助信息 196 | 197 | ![20191109_121314_11](image/20191109_121314_11.png) 198 | 199 | ![20191109_121331_32](image/20191109_121331_32.png) 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | --- 223 | -------------------------------------------------------------------------------- /docs/bash内置命令/alias.md: -------------------------------------------------------------------------------- 1 | # alias 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/buildin.md: -------------------------------------------------------------------------------- 1 | # buildin 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/cd.md: -------------------------------------------------------------------------------- 1 | # cd 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/command.md: -------------------------------------------------------------------------------- 1 | # command 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/compgen.md: -------------------------------------------------------------------------------- 1 | # compgen 2 | 3 | 在bash中自动完成的内置命令,在按两次TAB键时调用。 4 | 5 | 列出您可以运行的所有命令: 6 | ``` 7 | compgen -c. 8 | ``` 9 | 10 | 列出所有别名: 11 | ``` 12 | compgen -a 13 | ``` 14 | 15 | 列出您可以运行的所有功能: 16 | 17 | ``` 18 | compgen -A function 19 | ``` 20 | 21 | 显示shell保留的关键词: 22 | ``` 23 | compgen -k 24 | ``` 25 | 查看以'ls'开头的所有可用命令/别名: 26 | 27 | ``` 28 | compgen -ac {{ls}} 29 | ``` 30 | -------------------------------------------------------------------------------- /docs/bash内置命令/declare.md: -------------------------------------------------------------------------------- 1 | # declare 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/echo.md: -------------------------------------------------------------------------------- 1 | # echo 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/exec.md: -------------------------------------------------------------------------------- 1 | # exec 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/exit.md: -------------------------------------------------------------------------------- 1 | # exit 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/false.md: -------------------------------------------------------------------------------- 1 | # false 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/getopts.md: -------------------------------------------------------------------------------- 1 | # getopts 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/help.md: -------------------------------------------------------------------------------- 1 | # help 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/history.md: -------------------------------------------------------------------------------- 1 | # history 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/image/20191109_110117_52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/bash内置命令/image/20191109_110117_52.png -------------------------------------------------------------------------------- /docs/bash内置命令/image/20191109_110253_80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/bash内置命令/image/20191109_110253_80.png -------------------------------------------------------------------------------- /docs/bash内置命令/image/20191109_110423_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/bash内置命令/image/20191109_110423_19.png -------------------------------------------------------------------------------- /docs/bash内置命令/image/20191109_110718_99.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/bash内置命令/image/20191109_110718_99.png -------------------------------------------------------------------------------- /docs/bash内置命令/image/20191109_111412_75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/bash内置命令/image/20191109_111412_75.png -------------------------------------------------------------------------------- /docs/bash内置命令/image/20191109_111452_41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/bash内置命令/image/20191109_111452_41.png -------------------------------------------------------------------------------- /docs/bash内置命令/let.md: -------------------------------------------------------------------------------- 1 | # let 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/pwd.md: -------------------------------------------------------------------------------- 1 | # pwd 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/read.md: -------------------------------------------------------------------------------- 1 | # read 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/readonly.md: -------------------------------------------------------------------------------- 1 | # readonly 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/set.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [set](#set) 4 | - [基本语法](#基本语法) 5 | - [选项](#选项) 6 | - [实例](#实例) 7 | - [不带参数的set命令用来显示环境变量](#不带参数的set命令用来显示环境变量) 8 | - [遇到错误就退出 -e 或者 -o errexit](#遇到错误就退出-e-或者-o-errexit) 9 | - [遇到不存在的变量就退出 -u 或者 -o nounset](#遇到不存在的变量就退出-u-或者-o-nounset) 10 | - [执行的时候输出对应的命令 -x 或者 -o xtrace](#执行的时候输出对应的命令-x-或者-o-xtrace) 11 | - [关闭模式匹配 -f 或者 -o noglob](#关闭模式匹配-f-或者-o-noglob) 12 | - [参考](#参考) 13 | 14 | 15 | # set 16 | 17 | set命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题。本文介绍它的基本用法,让你可以更安心地使用 Bash 脚本。 18 | 19 | ## 基本语法 20 | 21 | ``` 22 | set [+-abCdefhHklmnpPtuvx] 23 | ``` 24 | 25 | ## 选项 26 | 27 | | 选项 | 说明 | 28 | | -------------- | -------------------------------------------------------- | 29 | | -a | 显示修改的变量 | 30 | | -u /-o nounset | 遇到不存在的变量报错并退出执行 | 31 | | -x /-o xtrace | 调试输出,执行命令前先输出完整命令 | 32 | | -e /-o errexit | 执行遇到错误就退出。若指令传回值不等于0,则立即退出shell | 33 | | -eo pipefail | 只要一个子命令失败,管道命令失败,脚本终止执行 | 34 | | -euxo pipefial | 遇到不存在变量退出,执行错误退出,管道失败退出,调试输出 | 35 | 36 | ## 实例 37 | 38 | ### 不带参数的set命令用来显示环境变量 39 | 40 | ![20191109_110117_52](image/20191109_110117_52.png) 41 | 42 | ### 遇到错误就退出 -e 或者 -o errexit 43 | 44 | ![20191109_110253_80](image/20191109_110253_80.png) 45 | 46 | * 遇到不存在命令执行错误退出,后序命令不执行 47 | 48 | ### 遇到不存在的变量就退出 -u 或者 -o nounset 49 | 50 | ![20191109_110423_19](image/20191109_110423_19.png) 51 | 52 | * HELLO变量未定义,后序命令未执行 53 | 54 | ### 执行的时候输出对应的命令 -x 或者 -o xtrace 55 | 56 | ![20191109_110718_99](image/20191109_110718_99.png) 57 | 58 | * 对应的命令会以+开头形式输出 59 | 60 | ### 关闭模式匹配 -f 或者 -o noglob 61 | 62 | ![20191109_111412_75](image/20191109_111412_75.png) 63 | 64 | * 关闭就是-f 65 | * 开启就是+f 66 | 67 | ![20191109_111452_41](image/20191109_111452_41.png) 68 | 69 | * 通过特殊环境变量$-来查看set的标记 70 | 71 | ## 参考 72 | 73 | * 74 | * 75 | -------------------------------------------------------------------------------- /docs/bash内置命令/shift.md: -------------------------------------------------------------------------------- 1 | # shift 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/shopt.md: -------------------------------------------------------------------------------- 1 | # shopt 2 | 3 | shopt命令用于显示和设置shell中的行为选项,通过这些选项以增强shell易用性。shopt命令若不带任何参数选项,则可以显示所有可以设置的shell操作选项。 4 | 5 | ## 语法 6 | 7 | shopt(选项)(参数) 8 | 9 | ## 选项 10 | 11 | -s:激活指定的shell行为选项; 12 | -u:关闭指定的shell行为选项。 13 | 14 | 15 | ## 举栗子 16 | 17 | ### 罗列可以用的shell行为选项 18 | 19 | * 默认shopt就是罗列选项及状态 20 | 21 | ``` 22 | [root@vm ~/shell/case]# shopt 23 | autocd off 24 | cdable_vars off 25 | cdspell off 26 | checkhash off 27 | checkjobs off 28 | checkwinsize on 29 | cmdhist on 30 | compat31 off 31 | compat32 off 32 | compat40 off 33 | compat41 off 34 | direxpand off 35 | dirspell off 36 | dotglob off 37 | execfail off 38 | expand_aliases on 39 | extdebug off 40 | extglob on 41 | extquote on 42 | failglob off 43 | force_fignore on 44 | globstar off 45 | gnu_errfmt off 46 | histappend on 47 | histreedit off 48 | histverify off 49 | hostcomplete off 50 | huponexit off 51 | interactive_comments on 52 | lastpipe off 53 | lithist off 54 | login_shell off 55 | mailwarn off 56 | no_empty_cmd_completion off 57 | nocaseglob off 58 | nocasematch off 59 | nullglob off 60 | progcomp on 61 | promptvars on 62 | restricted_shell off 63 | shift_verbose off 64 | sourcepath on 65 | xpg_echo off 66 | ``` 67 | 68 | 69 | ### 设置shell执行case时忽略大小写 70 | 71 | ``` 72 | shopt -s nocasematch 73 | ``` 74 | 75 | 76 | 77 | --- 78 | -------------------------------------------------------------------------------- /docs/bash内置命令/test.md: -------------------------------------------------------------------------------- 1 | # test 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/true.md: -------------------------------------------------------------------------------- 1 | # true 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/ulimit.md: -------------------------------------------------------------------------------- 1 | # ulimit 2 | 3 | -------------------------------------------------------------------------------- /docs/bash内置命令/umask.md: -------------------------------------------------------------------------------- 1 | # umask 2 | 3 | -------------------------------------------------------------------------------- /docs/gawk.md: -------------------------------------------------------------------------------- 1 | # 第22章-gawk进阶 2 | 3 | -------------------------------------------------------------------------------- /docs/grep.md: -------------------------------------------------------------------------------- 1 | # 文本三剑客之grep 2 | 3 | -------------------------------------------------------------------------------- /docs/image/1528730943495.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1528730943495.png -------------------------------------------------------------------------------- /docs/image/1529669130178.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1529669130178.png -------------------------------------------------------------------------------- /docs/image/1529669225210.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1529669225210.png -------------------------------------------------------------------------------- /docs/image/1529669248468.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1529669248468.png -------------------------------------------------------------------------------- /docs/image/1529669301175.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1529669301175.png -------------------------------------------------------------------------------- /docs/image/1529669359364.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1529669359364.png -------------------------------------------------------------------------------- /docs/image/1529669378625.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1529669378625.png -------------------------------------------------------------------------------- /docs/image/1529669437044.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1529669437044.png -------------------------------------------------------------------------------- /docs/image/1529672770386.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1529672770386.png -------------------------------------------------------------------------------- /docs/image/1529672997163.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1529672997163.png -------------------------------------------------------------------------------- /docs/image/1529673049790.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1529673049790.png -------------------------------------------------------------------------------- /docs/image/1529673328533.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1529673328533.png -------------------------------------------------------------------------------- /docs/image/1529673349988.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/1529673349988.png -------------------------------------------------------------------------------- /docs/image/20190916_220300_91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20190916_220300_91.png -------------------------------------------------------------------------------- /docs/image/20190916_220639_49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20190916_220639_49.png -------------------------------------------------------------------------------- /docs/image/20190916_220904_75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20190916_220904_75.png -------------------------------------------------------------------------------- /docs/image/20190916_222255_96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20190916_222255_96.png -------------------------------------------------------------------------------- /docs/image/20191109_120612_34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20191109_120612_34.png -------------------------------------------------------------------------------- /docs/image/20191109_121028_98.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20191109_121028_98.png -------------------------------------------------------------------------------- /docs/image/20191109_121314_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20191109_121314_11.png -------------------------------------------------------------------------------- /docs/image/20191109_121331_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20191109_121331_32.png -------------------------------------------------------------------------------- /docs/image/20191109_121748_30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20191109_121748_30.png -------------------------------------------------------------------------------- /docs/image/20191109_121832_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20191109_121832_21.png -------------------------------------------------------------------------------- /docs/image/20191109_122013_36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20191109_122013_36.png -------------------------------------------------------------------------------- /docs/image/20191109_122027_46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20191109_122027_46.png -------------------------------------------------------------------------------- /docs/image/20191109_122239_68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/image/20191109_122239_68.png -------------------------------------------------------------------------------- /docs/sed.md: -------------------------------------------------------------------------------- 1 | # 第21章-sed进阶 2 | 3 | -------------------------------------------------------------------------------- /docs/shell原理.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [走进shell](#走进shell) 4 | - [总结](#总结) 5 | - [tty+pty+pts+ptmx](#ttyptyptsptmx) 6 | - [tty(终端设备的统称):](#tty终端设备的统称) 7 | - [pty(虚拟终端):](#pty(虚拟终端) 8 | - [pts/ptmx(pts/ptmx结合使用,进而实现pty):](#ptsptmxptsptmx结合使用,进而实现pty) 9 | - [dev目录下常见特殊文件](#dev目录下常见特殊文件) 10 | - [串行端口终端(/dev/ttySn)](#串行端口终端devttysn) 11 | - [伪终端(/dev/pty/)](#伪终端devpty) 12 | - [控制终端(/dev/tty)](#控制终端devtty) 13 | - [控制台终端(/dev/ttyn, /dev/console)](#控制台终端devttyn-devconsole) 14 | - [虚拟终端(/dev/pts/n)](#虚拟终端devptsn) 15 | - [其它类型](#其它类型) 16 | - [setterm命令](#setterm命令) 17 | 18 | 19 | # 走进shell 20 | 21 | ## 总结 22 | 23 | * xterm是Linux中第一个可用的终端仿真器,能够仿真旧式终端硬件 24 | * 图形界面下能够启动shell终端都是终端仿真器,常见的有GNOME Terminal(GNU系列发行版)、Konsole Terminal(KDE桌面)和xterm(老古董) 25 | 26 | ## tty+pty+pts+ptmx 27 | 28 | ### tty(终端设备的统称): 29 | tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所以现在叫终端比较合适。 30 | 终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。 31 | 32 | ### pty(虚拟终端): 33 | 但是如果我们远程telnet到主机或使用xterm时不也需要一个终端交互么?是的,这就是虚拟终端pty(pseudo-tty) 34 | 35 | ### pts/ptmx(pts/ptmx结合使用,进而实现pty): 36 | pts(pseudo-terminal slave)是pty的实现方法,与ptmx(pseudo-terminal master)配合使用实现pty。 37 | 38 | ### dev目录下常见特殊文件 39 | 40 | 在Linux系统的设备特殊文件目录/dev/下,终端特殊设备文件一般有以下几种 41 | 42 | #### 串行端口终端(/dev/ttySn) 43 | 44 | 串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为 那时它的最大用途就是用来连接终端。这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0), /dev/tts/1(或/dev/ttyS1)等,设备号分别是(4,0), (4,1)等,分别对应于DOS系统下的COM1、COM2等。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。例如, 在命令行提示符下键入:echo test > /dev/ttyS1会把单词”test”发送到连接在ttyS1(COM2)端口的设备上。可接串口来实验。 45 | 46 | #### 伪终端(/dev/pty/) 47 | 48 | 伪终端(Pseudo Terminal)是成对的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上)。 49 | 例 如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统中分别是/dev/pty/m3和 /dev/pty/s3)。它们与实际物理设备并不直接相关。如果一个程序把ptyp3(master设备)看作是一个串行端口设备,则它对该端口的读/ 写操作会反映在该逻辑终端设备对应的另一个ttyp3(slave设备)上面。而ttyp3则是另一个程序用于读写操作的逻辑设备。 50 | 51 | 这样,两个程序就可以通过这种逻辑设备进行互相交流,而其中一个使用ttyp3的程序则认为自己正在与一个串行端口进行通信。这很象是逻辑设备对之间的管道 操作。对于ttyp3(s3),任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。但对于使用ptyp3的程序,则需要专门设计来使用 ptyp3(m3)逻辑设备。 52 | 53 | 例如,如果某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会开始连接到设备 ptyp2(m2)上(一个伪终端端口上)。此时一个getty程序就应该运行在对应的ttyp2(s2)端口上。当telnet从远端获取了一个字符 时,该字符就会通过m2、s2传递给 getty程序,而getty程序就会通过s2、m2和telnet程序往网络上返回”login:”字符串信息。这样,登录程序与telnet程序就通 过“伪终端”进行通信。通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。 54 | 55 | 在使用设备文件系统 (device filesystem)之前,为了得到大量的伪终端设备特殊文件,使用了比较复杂的文件名命名方式。因为只存在16个ttyp(ttyp0—ttypf) 的设备文件,为了得到更多的逻辑设备对,就使用了象q、r、s等字符来代替p。例如,ttys8和ptys8就是一个伪终端设备对。不过这种命名方式目前 仍然在RedHat等Linux系统中使用着。 56 | 57 | 但Linux 系统上的Unix98并不使用上述方法,而使用了”pty master”方式,例如/dev/ptm3。它的对应端则会被自动地创建成/dev/pts/3。这样就可以在需要时提供一个pty伪终端。目录 /dev/pts是一个类型为devpts的文件系统,并且可以在被加载文件系统列表中看到。虽然“文件”/dev/pts/3看上去是设备文件系统中的 一项,但其实它完全是一种不同的文件系统。 58 | 59 | 即TELNET ---> TTYP3(S3: slave) ---> PTYP3(M3: master) ---> GETTY 60 | 61 | ``` 62 | 实验: 63 | 1、在X下打开一个或N个终端窗口 64 | 2、#ls /dev/pt* 65 | 3、关闭这个X下的终端窗口,再次运行;比较两次输出信息就明白了。 66 | 在RHEL4环境下: 输出为/dev/ptmx /dev/pts/1存在一(master)对多(slave)的情况 67 | ``` 68 | 69 | #### 控制终端(/dev/tty) 70 | 71 | 如果当前进程有控制终端(Controlling Terminal)的话,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令”ps –ax”来查看进程与哪个控制终端相连。对于你登录的shell,/dev/tty就是你使用的终端,设备号是(5,0)。使用命令”tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个联接。 72 | 73 | 74 | #### 控制台终端(/dev/ttyn, /dev/console) 75 | 76 | 在Linux 系统中,计算机显示器通常被称为控制台终端 (Console)。它仿真了类型为Linux的一种终端(TERM=Linux),并且有一些设备特殊文件与之相关联:tty0、tty1、tty2 等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。tty1–tty6等 称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到 控制台终端上。你可以登录到不同的虚拟终端上去,因而可以让系统同时有几个不同的会话期存在。只有系统或超级用户root可以向 /dev/tty0进行写操作 即下例: 77 | 78 | ``` 79 | 1、# tty(查看当前TTY) 80 | /dev/tty1 81 | 2、#echo "test tty0" > /dev/tty0 82 | test tty0 83 | ``` 84 | 85 | 86 | #### 虚拟终端(/dev/pts/n) 87 | 88 | 在X windows模式下的伪终端。 89 | 90 | 91 | #### 其它类型 92 | 93 | Linux系统中还针对很多不同的字符设备存在有很多其它种类的终端设备特殊文件。例如针对ISDN设备的/dev/ttyIn终端设备等。这里不再赘述。 94 | 95 | 96 | ## setterm命令 97 | 98 | ![1529672770386.png](image/1529672770386.png) 99 | 100 | ``` 101 | root@ubuntu16:~# setterm --help 102 | 103 | Usage: 104 | setterm [options] 105 | 106 | Set the attributes of a terminal. 107 | 108 | 选项: 109 | --term override TERM environment variable 110 | --reset reset terminal to power-on state 111 | --initialize display init string, and use default settings 112 | --default use default terminal settings 113 | --store save current terminal settings as default 114 | --cursor [on|off] display cursor 115 | --repeat [on|off] keyboard repeat 116 | --appcursorkeys [on|off] cursor key application mode 117 | --linewrap [on|off] continue on a new line when a line is full 118 | --inversescreen [on|off] swap colors for the whole screen 119 | --foreground default| set foreground color 120 | --background default| set background color 121 | --ulcolor [bright] set underlined text color 122 | --hbcolor [bright] set bold text color 123 | : black blue cyan green grey magenta red white yellow 124 | --bold [on|off] bold 125 | --half-bright [on|off] dim 126 | --blink [on|off] blink 127 | --underline [on|off] underline 128 | --reverse [on|off] swap foreground and background colors 129 | --clear [all|rest] clear screen and set cursor position 130 | --tabs [...] set these tab stop positions, or show them 131 | --clrtabs [...] clear these tab stop positions, or all 132 | --regtabs [1-160] set a regular tab stop interval 133 | --blank [0-60|force|poke] set time of inactivity before screen blanks 134 | --dump [] write vcsa console dump to file 135 | --append [] append vcsa console dump to file 136 | --file name of the dump file 137 | --msg [on|off] send kernel messages to console 138 | --msglevel 0-8 kernel console log level 139 | --powersave [on|vsync|hsync|powerdown|off] 140 | set vesa powersaving features 141 | --powerdown [0-60] set vesa powerdown interval in minutes 142 | --blength [0-2000] duration of the bell in milliseconds 143 | --bfreq bell frequency in Hertz 144 | --version show version information and exit 145 | --help display this help and exit 146 | 147 | For more details see setterm(1). 148 | root@ubuntu16:~# 149 | ``` 150 | 151 | ![1529672997163.png](image/1529672997163.png) 152 | 153 | ``` 154 | root@ubuntu16:~# setterm -foreground green 155 | ``` 156 | 157 | 修改前景色,只是字体颜色 158 | 159 | ![1529673049790.png](image/1529673049790.png) 160 | 161 | ``` 162 | root@ubuntu16:~# setterm -background red 163 | ``` 164 | 165 | 修改背景色,字体的背景 166 | 167 | * 共有8种颜色可供选择,分别是black、 red、 green、 yellow、 blue、 magenta、 cyan和white(这种颜色在有些发行版中看起来像灰色)。 168 | * 设置好了记得store存储设置,不然输入几次命令就会回退原来的样式,保存之后就算退出终端重新进入也是这个样式,但是再开一个tty就不是这个样式了。 169 | 170 | 171 | ![1529673328533.png](image/1529673328533.png) 172 | 173 | 174 | ![1529673349988.png](image/1529673349988.png) 175 | -------------------------------------------------------------------------------- /docs/shell原理/命令的结束状态.md: -------------------------------------------------------------------------------- 1 | # 命令的结束状态 2 | 3 | 1. 任何一条命令执行一般会有两种类型的结果输出,一种是命令本身执行的输出,一种是执行结束后返回状态输出 4 | 2. 命令本身执行的输出 不一定有,根据命令的功能而定是否有必要进行可视化显示输出 5 | 3. 执行结束后返回状态输出 是每个命令必须有的,一般返回0表示执行成功,ok之意。其他值均为错误值。具体意义可根据程序而定,用于后序错误处理 6 | -------------------------------------------------------------------------------- /docs/shell简介.md: -------------------------------------------------------------------------------- 1 | # shell简介 2 | 3 | 4 | ## 总结 5 | 6 | ![1529669130178.png](image/1529669130178.png) 7 | 8 | * 这个图看着很怪异,难道没有似曾相识的的感觉? 9 | * Linux内核只负责内核,对上层提供支持,下面这个划分很奇怪呀 10 | 11 | ![1529669225210.png](image/1529669225210.png) 12 | 13 | * 虚拟内存必不可少分段分页,页表机制 14 | 15 | ![1529669248468.png](image/1529669248468.png) 16 | 17 | * 有了VFS,文件系统可以不用一开始就编译进内核。当然,启动引导所涉及的分区文件系统还是必须要有的,不然自举过程就是败了。 18 | 19 | ![1529669301175.png](image/1529669301175.png) 20 | 21 | * shell种类众多,能生存下来肯定有他的优势 22 | 23 | ![1529669359364.png](image/1529669359364.png) 24 | 25 | * X window其实是一个协议,X.org只是协议的一种实现。为嘛要X?字母W后是啥?明摆着跟微软较真。 26 | 27 | ![1529669378625.png](image/1529669378625.png) 28 | 29 | * 我比较习惯CentOS和Ubuntu 30 | 31 | ![1529669437044.png](image/1529669437044.png) 32 | -------------------------------------------------------------------------------- /docs/函数.md: -------------------------------------------------------------------------------- 1 | # 函数 2 | 3 | -------------------------------------------------------------------------------- /docs/数据类型.md: -------------------------------------------------------------------------------- 1 | # 数据类型 2 | 3 | -------------------------------------------------------------------------------- /docs/数据类型/字符串.md: -------------------------------------------------------------------------------- 1 | # 字符串 2 | 3 | -------------------------------------------------------------------------------- /docs/数据类型/字符串/image/20191109_104652_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/数据类型/字符串/image/20191109_104652_17.png -------------------------------------------------------------------------------- /docs/数据类型/字符串/image/20191109_122817_38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/数据类型/字符串/image/20191109_122817_38.png -------------------------------------------------------------------------------- /docs/数据类型/字符串/image/20191109_152632_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/数据类型/字符串/image/20191109_152632_24.png -------------------------------------------------------------------------------- /docs/数据类型/字符串/image/20191109_153249_26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/数据类型/字符串/image/20191109_153249_26.png -------------------------------------------------------------------------------- /docs/数据类型/字符串/image/20191109_153302_69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/数据类型/字符串/image/20191109_153302_69.png -------------------------------------------------------------------------------- /docs/数据类型/字符串/image/20191109_153636_57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/数据类型/字符串/image/20191109_153636_57.png -------------------------------------------------------------------------------- /docs/数据类型/字符串/字符串截取与拼接.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [字符串变量](#字符串变量) 4 | - [快速浏览](#快速浏览) 5 | - [判断读取字符串值](#判断读取字符串值) 6 | - [获取字符串长度](#获取字符串长度) 7 | - [8种字符串截取方法](#8种字符串截取方法) 8 | - [1.删除左边字符,保留右边字符: # 就近匹配截取](#1删除左边字符,保留右边字符-#-就近匹配截取) 9 | - [2.删除左边字符,保留右边字符 ## 就远匹配截取](#2删除左边字符,保留右边字符-##-就远匹配截取) 10 | - [3.删除右边字符,保留左边字符 % 就近匹配截取](#3删除右边字符,保留左边字符-%-就近匹配截取) 11 | - [4.删除右边字符,保留左边字符 %% 就远匹配截取](#4删除右边字符,保留左边字符-%%-就远匹配截取) 12 | - [5.从左边第几个字符开始,及字符的个数](#5从左边第几个字符开始,及字符的个数) 13 | - [6.从左边第几个字符开始,一直到结束](#6从左边第几个字符开始,一直到结束) 14 | - [7.从右边第几个字符开始,截取右侧字符的个数](#7从右边第几个字符开始,截取右侧字符的个数) 15 | - [8.从右边第几个字符开始,截取右侧字符直到结束](#8从右边第几个字符开始,截取右侧字符直到结束) 16 | - [字符串拼接方法](#字符串拼接方法) 17 | - [性能比较](#性能比较) 18 | - [参考](#参考) 19 | 20 | 21 | # 字符串变量 22 | 23 | ## 快速浏览 24 | 25 | | 编号 | 使用方法 | 效果 | 26 | | ---- | ------------------ | ------------------------------------------ | 27 | | 1 | ${STRING%word} | 截取,最小限度从后面截取word | 28 | | 2 | ${STRING%%word} | 截取,最大限度从后面截取word | 29 | | 3 | ${STRING#word} | 截取,最小限度从前面截取word | 30 | | 4 | ${STRING##word} | 截取,最大限度从前面截取word | 31 | | 5 | ${#STRING} | 长度,获取字符串长度 | 32 | | 6 | ${STRING:-word} | | 33 | | 7 | ${STRING:=word} | | 34 | | 8 | ${STRING:?word} | | 35 | | 9 | ${STRING:+word} | | 36 | | 10 | ${STRING/old/new} | 替换,使用new来替代**第一个**匹配的old子串 | 37 | | 11 | ${STRING//old/new} | 替换,使用new来替代**所有**匹配的old子串 | 38 | | 12 | ${STRING/#old/new} | 替换,如果开头是old,那么替换成new | 39 | | 13 | ${STRING/%old/new} | 结尾,如果结尾临时old,那么替换成new | 40 | | | | | 41 | 42 | 43 | 44 | 45 | 46 | ![20191109_152632_24](image/20191109_152632_24.png) 47 | 48 | 49 | 50 | ## 判断读取字符串值 51 | 52 | ![20191109_153249_26](image/20191109_153249_26.png) 53 | 54 | 55 | 56 | ## 获取字符串长度 57 | 58 | ``` 59 | VAR=https://mirror.tencent.com/index.html 60 | echo ${#VAR} 61 | ``` 62 | 结果是 : 63 | ```37``` 64 | 65 | 66 | 67 | 68 | ## 8种字符串截取方法 69 | 70 | 71 | ![20191109_153302_69](image/20191109_153302_69.png) 72 | 73 | 假设有变量VAR 74 | 75 | ``` 76 | VAR=https://mirror.tencent.com/index.html 77 | ``` 78 | 79 | ### 1.删除左边字符,保留右边字符: # 就近匹配截取 80 | 81 | ``` 82 | VAR=https://mirror.tencent.com/index.html 83 | echo ${VAR#*//} 84 | ``` 85 | 86 | 其中 VAR 是变量名,# 号是运算符,*//表示从左边开始删除第一个 // 号及左边的所有字符 87 | 88 | 即删除 https:// 89 | 结果是 : 90 | ``` 91 | www.tencent.com/index.html 92 | ``` 93 | 94 | ### 2.删除左边字符,保留右边字符 ## 就远匹配截取 95 | 96 | ``` 97 | VAR=https://mirror.tencent.com/index.html 98 | echo ${VAR##*/} 99 | ``` 100 | 101 | ```##*/``` 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符 102 | 103 | 即删除https://www.tencent.com/ 104 | 105 | 结果是 106 | ``` 107 | index.html 108 | ``` 109 | 110 | ### 3.删除右边字符,保留左边字符 % 就近匹配截取 111 | 112 | ``` 113 | VAR=https://mirror.tencent.com/index.html 114 | echo ${VAR%/*} 115 | ``` 116 | 117 | ```%/*``` 表示从右边开始,删除**第一个 /** 号及右边的字符 118 | 119 | 结果是: 120 | 121 | ``` 122 | https://www.tencent.com 123 | ``` 124 | 125 | ### 4.删除右边字符,保留左边字符 %% 就远匹配截取 126 | 127 | ``` 128 | VAR=https://mirror.tencent.com/index.html 129 | echo ${VAR%%/*} 130 | ``` 131 | 132 | ```%%/*``` 表示从右边开始,删除最后**(最左边,就远处)一个 / **号及右边的字符 133 | 134 | 结果是: 135 | ``` 136 | https: 137 | ``` 138 | 139 | ### 5.从左边第几个字符开始,及字符的个数 140 | 141 | ``` 142 | VAR=https://mirror.tencent.com/index.html 143 | echo ${VAR:0:5} 144 | ``` 145 | 146 | * 其中的 0 表示左边第一个字符开始,5 表示字符的总个数 147 | * 字符从0开始计数,字符串数组下标 148 | 149 | 结果是: 150 | ``` 151 | https 152 | ``` 153 | 154 | ### 6.从左边第几个字符开始,一直到结束 155 | 156 | ``` 157 | VAR=https://mirror.tencent.com/index.html 158 | echo ${VAR:8} 159 | ``` 160 | 161 | * 其中的 8 表示左边第9个字符开始,一直到结束。 162 | * 字符从0开始计数,字符串数组下标 163 | 164 | 结果是: 165 | ``` 166 | www.tencent.com/index.html 167 | ``` 168 | 169 | ### 7.从右边第几个字符开始,截取右侧字符的个数 170 | 171 | ``` 172 | VAR=https://mirror.tencent.com/index.html 173 | echo ${VAR:0-10:5} 174 | ``` 175 | 176 | * 其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。 177 | 178 | 结果是:index 179 | 180 | ### 8.从右边第几个字符开始,截取右侧字符直到结束 181 | 182 | ``` 183 | VAR=https://mirror.tencent.com/index.html 184 | echo ${STRING:0-10} 185 | ``` 186 | 187 | * 表示从右边第10个字符开始截取右侧字符直到结束 188 | 189 | 结果是: 190 | ``` 191 | index.html 192 | ``` 193 | 194 | ## 字符串拼接方法 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | ## 性能比较 206 | 207 | 208 | 在shell中,通过awk,sed,expr等都可以实现,字符串上述操作。下面我们进行性能比较。 209 | 210 | 211 | ``` 212 | [root@vm ~]# test='https://mirrors.tencent.com' 213 | [root@vm ~]# time for i in $(seq 10000);do a=${#test};done; 214 | 215 | real 0m0.032s 216 | user 0m0.028s 217 | sys 0m0.004s 218 | [root@vm ~]# time for i in $(seq 10000);do a=$(expr length $test);done; 219 | 220 | real 0m11.813s 221 | user 0m0.260s 222 | sys 0m1.324s 223 | ``` 224 | 225 | ![20191109_153636_57](image/20191109_153636_57.png) 226 | 227 | 228 | * 速度相差上百倍,调用外部命令处理,与内置操作符性能相差非常大 229 | * 在shell编程中,尽量用内置操作符或者函数完成。使用awk,sed类似会出现这样结果。 230 | 231 | 232 | ## 参考 233 | 234 | * 235 | -------------------------------------------------------------------------------- /docs/数据类型/字符串/字符串替换.md: -------------------------------------------------------------------------------- 1 | # 字符串替换 2 | 3 | -------------------------------------------------------------------------------- /docs/文本三剑客.md: -------------------------------------------------------------------------------- 1 | # 文本三剑客 2 | 3 | -------------------------------------------------------------------------------- /docs/文本三剑客/gawk.md: -------------------------------------------------------------------------------- 1 | # gawk 2 | 3 | -------------------------------------------------------------------------------- /docs/文本三剑客/grep.md: -------------------------------------------------------------------------------- 1 | # grep 2 | 3 | -------------------------------------------------------------------------------- /docs/文本三剑客/sed.md: -------------------------------------------------------------------------------- 1 | # sed 2 | 3 | -------------------------------------------------------------------------------- /docs/文本编辑器.md: -------------------------------------------------------------------------------- 1 | # 文本编辑器 2 | 3 | -------------------------------------------------------------------------------- /docs/文本编辑器/emacs.md: -------------------------------------------------------------------------------- 1 | # emacs 2 | 3 | -------------------------------------------------------------------------------- /docs/文本编辑器/nano.md: -------------------------------------------------------------------------------- 1 | # nano 2 | 3 | -------------------------------------------------------------------------------- /docs/文本编辑器/vim.md: -------------------------------------------------------------------------------- 1 | # vim 2 | 3 | -------------------------------------------------------------------------------- /docs/正则表达式与模式匹配.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [正则表达式](#正则表达式) 4 | - [什么是正则表达式](#什么是正则表达式) 5 | - [grep, egrep](#grep-egrep) 6 | - [sed](#sed) 7 | - [awk(gawk)](#awk(gawk)) 8 | - [定义BRE模式](#定义bre模式) 9 | - [扩展的正则表达式](#扩展的正则表达式) 10 | - [正则表达式实战](#正则表达式实战) 11 | - [参考](#参考) 12 | - [小结](#小结) 13 | 14 | 15 | # 正则表达式 16 | 17 | ![20190916_222255_96](image/20190916_222255_96.png) 18 | 19 | 一个人希望掌握所有的正则表达式,却耗费了大量的时间,不知室外世事变迁,早已换了一个时代。 20 | 21 | 这个漫画讽刺了一些初学者,希望掌握一些比较复杂的东西的所有内容后再去做事,却不知道,这些东西过于复杂,你花费的时间可能很快就一文不值,因为它们可能已经过时了。 22 | 23 | 开发并不要求你掌握所有的内容,更多的时候,你只要能够掌握一些常用的,在真正需要用到的时候,再去查询一些比较详细的、不常用的内容即可。毕竟,没有人要求你马上做完所有事情。 24 | 25 | ## 什么是正则表达式 26 | 27 | ![20190916_220300_91](image/20190916_220300_91.png) 28 | 29 | * BREs, 基本的正则表达式(Basic Regular Expression) 30 | * EREs, 扩展的正则表达式(Extended Regular Expression) 31 | * PREs, Perl 的正则表达式(Perl Regular Expression) 32 | 33 | ![20190916_220639_49](image/20190916_220639_49.png) 34 | 35 | 36 | ### grep, egrep 37 | 38 | ``` 39 | 1)grep 支持:BREs、EREs、PREs 正则表达式 40 | 41 | - grep 指令后不跟任何参数,则表示要使用 ”BREs“ 42 | - grep 指令后跟 ”-E" 参数,则表示要使用 “EREs“ 43 | - grep 指令后跟 “-P" 参数,则表示要使用 “PREs" 44 | 45 | 2)egrep 支持:EREs、PREs 正则表达式 46 | 47 | - egrep 指令后不跟任何参数,则表示要使用 “EREs” 48 | - egrep 指令后跟 “-P" 参数,则表示要使用 “PREs" 49 | 50 | 3)grep 与 egrep 正则匹配文件,处理文件方法 51 | 52 | a. grep 与 egrep 的处理对象:文本文件 53 | b. grep 与 egrep 的处理过程:查找文本文件中是否含要查找的 “关键字”(关键字可以是正则表达式) ,如果含有要查找的 ”关健字“,那么默认返回该文本文件中包含该”关健字“的该行的内容,并在标准输出中显示出来,除非使用了“>" 重定向符号, 54 | c. grep 与 egrep 在处理文本文件时,是按行处理的 55 | ``` 56 | 57 | ### sed 58 | ``` 59 | 1)sed 文本工具支持:BREs、EREs 60 | 61 | - sed 指令默认是使用"BREs" 62 | - sed 命令参数 “-r ” ,则表示要使用“EREs" 63 | 64 | 2)sed 功能与作用 65 | 66 | a. sed 处理的对象:文本文件 67 | b. sed 处理操作:对文本文件的内容进行 --- 查找、替换、删除、增加等操作 68 | c. sed 在处理文本文件的时候,也是按行处理的 69 | ``` 70 | 71 | ### awk(gawk) 72 | 73 | ``` 74 | 1)Awk 文本工具支持:EREs 75 | 76 | - awk 指令默认是使用 “EREs" 77 | 78 | 2)Awk 文本工具处理文本的特点 79 | 80 | a. awk 处理的对象:文本文件 81 | b. awk 处理操作:主要是对列进行操作 82 | ``` 83 | 84 | ## 定义BRE模式 85 | 86 | **最基本的BRE模式是匹配数据流中的文本字符** 87 | 88 | ![20190916_220904_75](image/20190916_220904_75.png) 89 | 90 | * 特殊字符没有 ```# / - _ @ % & = ; ` , . \ ``` 91 | * 凡是要用到特殊字符都需要经过转移 \ 反斜杠字符 92 | 93 | ## 扩展的正则表达式 94 | 95 | ## 正则表达式实战 96 | 97 | 98 | ## 参考 99 | 100 | * 101 | * 102 | 103 | 104 | ## 小结 105 | 106 | 107 | 108 | --- 109 | -------------------------------------------------------------------------------- /docs/流程控制.md: -------------------------------------------------------------------------------- 1 | # 流程控制 2 | 3 | 1. 流程控制分为两大类:选择和循环 4 | 2. 属于选择的有:if、case 5 | 3. 属于循环的有:for、while、until 6 | 4. select既属于选择也属于循环 7 | 5. 不管哪种都要进行条件测试,根据测试结果决定程序进行的方向 8 | -------------------------------------------------------------------------------- /docs/流程控制/select命令.md: -------------------------------------------------------------------------------- 1 | # select命令 2 | 3 | -------------------------------------------------------------------------------- /docs/流程控制/判断.md: -------------------------------------------------------------------------------- 1 | # 判断 2 | 3 | -------------------------------------------------------------------------------- /docs/流程控制/判断/case.md: -------------------------------------------------------------------------------- 1 | # case 2 | 3 | ## 基本格式 4 | 5 | if的多条件判断格式如下: 6 | 7 | ``` 8 | if 判断条件1 ;then 命令区域1 9 | else if 判断条件2 ;then 命令区域2 10 | else if 判断条件3 ;then 命令区域3 11 | else if 判断条件4 ;then 命令区域4 12 | else if 判断条件5 ;then 命令区域5 13 | else 命令区域;fi 14 | ``` 15 | 16 | 写成case: 17 | 18 | ``` 19 | case 待测项 in 20 | 匹配模式1 ) 命令区域1 ;; 21 | 匹配模式2 ) 命令区域2 ;; 22 | 匹配模式3 ) 命令区域3 ;; 23 | 匹配模式4 ) 命令区域4 ;; 24 | 匹配模式5 ) 命令区域5 ;; 25 | ... 26 | *) 命令区域 ;; 27 | esac 28 | ``` 29 | 30 | 相比于if的改进点: 31 | 32 | 1. 减少代码字符,少敲好几个字符 33 | 2. 更简洁,结构紧凑 34 | 3. 方便日后维护 35 | 36 | 结构说明: 37 | 38 | 1. 待测项 **依次**与模式进行匹配,执行第一个配对中的命令区域 39 | 2. 每一分支中的模式,可以有多个,但必须以**)**结尾,左边括号可以有也可以没有 40 | 3. 命令表可以是一个命令或多个命令,多个命令可以多行写,最后一个命令要以;;结束 41 | 4. 分支语句的个数没有规定,可以无限制地增加。每一分支以**;;**表示该分支结束 42 | 5. 分支***)**是表示在前面所有可能的匹配都不满足时的处理方式,不一定要有,如果有一定放在最后 43 | 6. esac表示case结构结束,esac是case的反写 44 | 7. 模式中可以使用|,表示各模式之间是“或”的关系。例如,P|p意味着大写和小写的p都可匹配 45 | 8. 模式中可以使用Shell通配符,如*、?和[]等。 46 | 47 | 典型的case执行流程如图: 48 | 49 | ![20191109_131624_29](image/20191109_131624_29.png) 50 | 51 | 52 | ## 举栗子 53 | 54 | ### 基本用法 55 | 56 | ![20191109_143132_98](image/20191109_143132_98.png) 57 | 58 | ### 使用shopt增强case模式匹配 59 | 60 | * 是否执行命令区域前提是待测项与模式匹配。 61 | 62 | 基本的模式匹配包括: 63 | 64 | 1. 字符串 65 | 2. 通配符。```*```表任意长度字符串,也可以包含空字符串。```?```表示一个任意字符 66 | 3. 字符集合。如 ```[abcd]efg``` 67 | 4. 分隔符。如 ```a|b``` 68 | 69 | 通过shopt开启扩展匹配。涉及shopt相关内容请查看:[shopt](docs/bash内置命令/shopt.md) 70 | 71 | ``` 72 | shopt -s extglob # 开启扩展匹配 73 | shopt -u extglob # 关闭扩展匹配 74 | ``` 75 | 76 | 扩展匹配模式包括: 77 | 78 | 1. ?(模式) :如果符合 **0个或1个** 以上括号里的模式就算符合 79 | 2. *(模式) :如果符合 **0个以上** 括号里的模式就算符合 80 | 3. +(模式) :如果符合 **1个以上** 括号里的模式就算符合 81 | 4. @(模式) :如果符合 **1个** 括号里的模式就算符合 82 | 5. !(模式) :不出现括号里的模式匹配就算符合 83 | 84 | 85 | 86 | --- 87 | -------------------------------------------------------------------------------- /docs/流程控制/判断/if.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [if](#if) 4 | - [if判断相关的关键字](#if判断相关的关键字) 5 | - [基本格式](#基本格式) 6 | - [十种条件测试](#十种条件测试) 7 | - [执行某一个命令的结果](#执行某一个命令的结果) 8 | - [传回某个命令执行结果的相反值](#传回某个命令执行结果的相反值) 9 | - [带(())符号作为条件判断-内置命令let](#带符号作为条件判断-内置命令let) 10 | - [带[[]]符号组成的条件判断](#带符号组成的条件判断) 11 | - [使用内置命令: test "判断式"](#使用内置命令-test-判断式) 12 | - [带[]符号作为条件判断-内置命令test](#带符号作为条件判断-内置命令test) 13 | - [使用 -a,-o 进行逻辑组合](#使用-a-o-进行逻辑组合) 14 | - [命令1&&命令2](#命令1命令2) 15 | - [命令1||命令2](#命令1命令2) 16 | - [&&与||合用](#与合用) 17 | - [条件判断式](#条件判断式) 18 | - [文件判断](#文件判断) 19 | - [字符串比较](#字符串比较) 20 | - [数值比较](#数值比较) 21 | - [bash选项的条件判断](#bash选项的条件判断) 22 | 23 | 24 | # if 25 | 26 | ## if判断相关的关键字 27 | 28 | 1. if 29 | 2. then 30 | 3. else 31 | 4. elif **(PS:不是else if)** 32 | 5. fi 33 | 34 | ## 基本格式 35 | 36 | * 一行if至少三部分构成,各个部分用分号隔开 37 | * if和条件测试要有空格 38 | * 条件测试和分号不需要空格 39 | * then和命令区域要有空格 40 | * 命令区域和分号不需要空格 41 | * fi命令和分号不需要空格 42 | * 总结: **空格只需要在命令和条件测试左右出现就可以,不论多少,有一个就够了** 43 | 44 | ``` 45 | if 条件测试;then 命令区域;fi 46 | ``` 47 | 48 | * 单一处理的写法 49 | * 其中命令区域不要求缩进,不过为了方便阅读建议格式化 50 | * then可以跟if在同一行,但必须要求then前面有分号。也可另起一行,就不需要分好了。任何使用情况下then都是如此操作 51 | * 比较受欢迎的写法是把then与if放在同一行,减少脚本行数。 52 | * 命令区域可以不止一行,知道出现后序关键词为止。如果没有fi命令,if语句不会结束 53 | 54 | ``` 55 | if 条件测试 ;then 56 | 命令区域 57 | fi 58 | 59 | 或者 60 | 61 | if 条件测试 62 | then 63 | 命令区域 64 | fi 65 | ``` 66 | 67 | * 双处理写法 68 | 69 | ``` 70 | if 条件测试 ;then 71 | 命令区域 72 | else 73 | 命令区域 74 | fi 75 | 76 | 或者 77 | 78 | if 条件测试 79 | then 80 | 命令区域 81 | else 82 | 命令区域 83 | fi 84 | ``` 85 | 86 | * 包含if相关5个关键字的写法 87 | * 多处理写法,超多处理写法用case 88 | 89 | ``` 90 | if 条件测试 ;then 91 | 命令区域 92 | elif 条件测试;then 93 | 命令区域 94 | elif 条件测试;then 95 | 命令区域 96 | elif 条件测试;then 97 | 命令区域 98 | else 99 | 命令区域 100 | fi 101 | ``` 102 | 103 | ## 十种条件测试 104 | 105 | ### 执行某一个命令的结果 106 | 107 | 1. 如果命令执行成功,命令的返回状态码为0,条件判断为True。否则为False 108 | 2. 返回状态码通过特殊变量**$?**表示 109 | 110 | 111 | ![20191108_171238_96](image/20191108_171238_96.png) 112 | 113 | 通过这个例子可以看出,条件判断里面执行的命令返回状态会赋值给 **$?** 特殊环境变量,而不是之前的命令执行结果赋值给 **$?** 114 | 115 | ### 传回某个命令执行结果的相反值 116 | 117 | 1. 通过if/elif与判断条件之间添加**!**,进行取反操作 118 | 2. **!** 两边必须至少有一个空字符 119 | 120 | ### 带(())符号作为条件判断-内置命令let 121 | 122 | * 运算结果不为0就返回False,否则返回True。0为真True,非0为假False 123 | * 就算是负数也是返回True,只有,切记,只有0才返回False 124 | * **(( 算式 )) 本质就是 let “算式”**,let是bash的内置命令 125 | * **(( 算式 ))** 算式左右与括号之间必须要有空格(空字符) 126 | 127 | ![20191108_171444_95](image/20191108_171444_95.png) 128 | 129 | * (())是bash的复合命令,内置算式。因为它自己用到了自己内置的模块,是由多个小功能协作完成 130 | * 什么叫内置,按理说一个程序如果只负责一个小功能,太分散了。那么把多个程序集成到一个程序也是可以的。busybox就是典型的例子。 131 | * **((算式))** 可以对算式的运算结果传回真假值。**非0就是真,0就是假** 132 | 133 | **((算式)) 本质就是 let “算式”** 134 | 135 | * 如果去查看let 的man帮助,会发现他其实就是bash内置命令 136 | 137 | ![20191108_170205_62](image/20191108_170205_62.png) 138 | 139 | * 按理说**算式两边的引号不可以少**,实际也能跑通,**书写规范及避免犯错,最好加上引号** 140 | * *(())很自由,不需要转义** ,对于<、>、&&、||可以自由使用,不用转义。记忆:多写了一堆括号,好处肯定要有,不然白写 141 | 142 | 143 | 144 | ### 带[[]]符号组成的条件判断 145 | 146 | * [[ 的前后至少一个空格,```if [[ 条件判断``` 147 | * ]] 的前面至少一个空格,```条件判断 ]]``` 148 | * ]];then 是可以的,所以]]后面不一定要空格,有也是可以的。```[[ 条件判断 ]];then ``` 149 | 150 | ![20191108_172226_42](image/20191108_172226_42.png) 151 | 152 | 通过这个例子可以看出, 153 | 154 | 1. **[[ 条件判断 ]]**里面执行的命令返回状态会赋值给 **$?** 特殊环境变量,而不是之前的命令执行结果赋值给 **$?** 155 | 2. 条件判断里面执行命令的输出内容不会在终端打印 156 | 157 | **[[]]比[]更自由,不需要转义** ,对于<、>、&&、||可以自由使用,不用转义。记忆:多写了一堆括号,好处肯定要有,不然白写 158 | 159 | ![20191108_192645_58](image/20191108_192645_58.png) 160 | 161 | ![20191108_193052_52](image/20191108_193052_52.png) 162 | 163 | 通过这个例子可以看出, 164 | 165 | 1. [[ ]]中,如果用到 == 或 != ,如果这两个运算符**右**方的字符串没有加上单引号或双引号,那么就会被视为模式匹配。加上单引号或双引号就是字符串配对,双引号中会变量替换,单引号不会 166 | 167 | ![20191108_193323_51](image/20191108_193323_51.png) 168 | 169 | 通过这个例子可以看出, 170 | 171 | 1. ```*[.?\!]```模式匹配规则,是否仅包含. ? !这三种字符的任意一种字符作为字符串结尾,其中!需要转义 172 | 173 | bash 3.2版本之后支撑增强版正则表达式匹配,其用法与perl正则表达式差不多 174 | 175 | ``` 176 | [[ 字符串 =~ 匹配模式 ]] 177 | ``` 178 | 179 | ![20191108_193939_57](image/20191108_193939_57.png) 180 | 181 | 通过这个例子可以看出, 182 | 183 | 1. 不是精确匹配,最少有多少字符。任意匹配上的字符最少有多少个 184 | 185 | 186 | ### 使用内置命令: test "判断式" 187 | 188 | 格式: 189 | 190 | ``` 191 | if test "判断式";then 192 | 命令区域 193 | elif test "判断式";then 194 | 命令区域 195 | fi 196 | ``` 197 | 198 | 199 | * test是bash的内置命令 200 | * **大于符号、小于符号对bash而言是特殊字符,必须要经过转义** 201 | 202 | ![20191108_172707_11](image/20191108_172707_11.png) 203 | 204 | ### 带[]符号作为条件判断-内置命令test 205 | 206 | 格式: 207 | 208 | ``` 209 | if [ 判断式 ];then 210 | 命令区域 211 | elif [ 判断式 ];then 212 | 命令区域 213 | fi 214 | ``` 215 | 216 | * 带[]符号的内置命令 其实 跟 test "判断式" 是一样一样的 217 | * 对bash而言特殊的字符需要转义,大于号,小于号,还有哪些? 218 | 219 | ![20191108_183550_36](image/20191108_183550_36.png) 220 | 221 | ### 使用 -a,-o 进行逻辑组合 222 | 223 | ``` 224 | if [ -r file1 -a -x file2 ];then 225 | 命令区域 226 | fi 227 | 228 | 229 | if [ -r file1 -a -x file2 ];then 230 | 命令区域 231 | fi 232 | ``` 233 | 234 | ### 命令1&&命令2 235 | 236 | ``` 237 | if 命令1 参数 && 命令2 参数;then 238 | 命令区域 239 | fi 240 | ``` 241 | * && 称为逻辑AND,**前一个为假就立即为假,后一个都不执行** 242 | 243 | ![20191108_190535_39](image/20191108_190535_39.png) 244 | 245 | * if判断式左右没有任何括号,会把命令执行结果在终端输出。 246 | 247 | ![20191108_185908_16](image/20191108_185908_16.png) 248 | 249 | * 判断里面尽量加引号,一个好的习惯减少超级多错误 250 | * **凡是 ```[ 判断式 ] && 命令``` 的形式都被视为隐形的if-true-then写法**,举例:判断命令是否存在 251 | 252 | ![20191108_191547_58](image/20191108_191547_58.png) 253 | 254 | * 有一个误区,if 判断式中真假应该用True和False表示,而不是0和非0。不然真真用的时候回反过来。 255 | * **True = 0,False = !0** 256 | 257 | ### 命令1||命令2 258 | 259 | ``` 260 | if 命令1 参数 || 命令2 参数;then 261 | 命令区域 262 | fi 263 | ``` 264 | 265 | * || 称为逻辑OR,**只有前一个为假才会执行第二个** 266 | * **凡是 ```[ 判断式 ] || 命令``` 的形式都被视为隐形的if-false-then写法**,举例:创建新目录 267 | 268 | ![20191108_191345_88](image/20191108_191345_88.png) 269 | 270 | 271 | ### &&与||合用 272 | 273 | 274 | ``` 275 | if 命令1 参数 && 命令2 参数 || 命令3 ;then 276 | 命令区域 277 | fi 278 | ``` 279 | 280 | * **凡是 ```[ 判断式 ] && 命令 || 命令 ``` 的形式都被视为隐形的if-then-else写法** 281 | 282 | 283 | ## 条件判断式 284 | 285 | ### 文件判断 286 | 287 | | 判断式 | 什么情况下为真 | 288 | | -------- | -------------------------- | 289 | | -a 文件 | 如果文件存在 | 290 | | -b 文件 | 如果文件存在,且为块设备 | 291 | | -c 文件 | 如果文件存在,且为字符设备 | 292 | | -d 文件 | 如果文件存在,且为目录 | 293 | | -e 文件 | 文件存在,不管类型,有就行 | 294 | | -f 文件 | 文件存在,且必须为普通文件 | 295 | | -r 文件 | 文件存在,且可读 | 296 | | -w 文件 | 文件存在,且可写 | 297 | | -x 文件 | 文件存在,且可执行 | 298 | 需要特别对待的 299 | 300 | 301 | | 判断式 | 什么情况下为真 | 302 | | --------------- | ---------------------------------- | 303 | | -s 文件 | 如果文件存在,且非空 | 304 | | -h 文件 | 文件存在,且为符号链接 | 305 | | -p 文件 | 文件存在,且为管道文件 | 306 | | -O 文件 | 如果文件存在,且执行用户所有 | 307 | | -G 文件 | 如果文件存在,且执行用户所在组 | 308 | | -g 文件 | 文件存在,并且设定group id属性 | 309 | | -u 文件 | 文件存在,并且设定user id属性 | 310 | | -S 文件 | 文件存在,并且设定sticky属性 | 311 | | -t 文件描述符 | 文件描述符开启,且链接了某个终端 | 312 | | -N 文件 | 文件存在,且自从上次读取后被修改过 | 313 | | FileA -nt FileB | FileA比FileB新,newer than | 314 | | FileA -ot FileB | FileA比FileB旧,older than | 315 | 316 | 317 | ### 字符串比较 318 | 319 | | 判断式 | 什么情况下为真 | 320 | | ------------ | -------------------------- | 321 | | STR1 = STR2 | 相同 | 322 | | STR1 == STR2 | 相同 | 323 | | STR1 != STR2 | 不相同 | 324 | | STR1 < STR2 | 小 | 325 | | STR1 > STR2 | 大 | 326 | | -n STR | not zero 非0长度,非空字符 | 327 | | -z STR | 字符串长度为0 | 328 | | STR | 字符串长度不为0 | 329 | 330 | 331 | 字符串比较的坑: 332 | 333 | ![20191109_124541_22](image/20191109_124541_22.png) 334 | 335 | * **这里变量只是单纯的进行替换,如果变量为空,那么会造成if语法不完全的错误** 336 | 337 | 如果没有提供参数,那么替换掉 $NAME 变量后变成 338 | 339 | ```if [ = "nic" ];then echo "NAME is nic";else echo "Name is $1";fi``` 340 | 341 | 改进一: 342 | 343 | 对于当前bash环境有效,但是其他shell环境不一定可以 344 | 345 | ![20191109_124733_17](image/20191109_124733_17.png) 346 | 347 | 改进二: 348 | 349 | 此种改进移植性更好 350 | 351 | ![20191109_125634_74](image/20191109_125634_74.png) 352 | 353 | 如果$NAME为空,那么就变成如下形式,不影响结果 354 | 355 | ``` 356 | if [ Y = Ynic ] 357 | ``` 358 | 359 | ### 数值比较 360 | 361 | | 判断式 | 什么情况下为真 | 362 | | ------------- | -------------- | 363 | | NUM1 -eq NUM2 | qeual | 364 | | NUM1 -ge NUM2 | greater equal | 365 | | NUM1 -gt NUM2 | greater than | 366 | | NUM1 -le NUM2 | less queal | 367 | | NUM1 -lt NUM2 | leas than | 368 | | NUM1 -ne NUM2 | not qeual | 369 | 370 | * 有g就是大,有e就是相等,有l就是小,有n就是取反 371 | 372 | ### bash选项的条件判断 373 | 374 | | 判断式 | 什么情况下为真 | 375 | | ------------ | -------------------------- | 376 | | -o set的选项名称 | 该选项是开启状态 | 377 | 378 | 379 | set相关内容参看:[set](docs/bash内置命令/set.md) 380 | 381 | ![20191109_112408_17](image/20191109_112408_17.png) 382 | 383 | * set选项需要全写,不得简写,简写没效果 384 | * $- 特殊环境变量可以查看set设定的标记 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | --- 394 | -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_170205_62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_170205_62.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_171238_96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_171238_96.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_171444_95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_171444_95.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_172226_42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_172226_42.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_172707_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_172707_11.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_183550_36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_183550_36.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_185908_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_185908_16.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_190535_39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_190535_39.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_191345_88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_191345_88.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_191547_58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_191547_58.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_192645_58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_192645_58.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_193052_52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_193052_52.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_193323_51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_193323_51.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191108_193939_57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191108_193939_57.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191109_112408_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191109_112408_17.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191109_124541_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191109_124541_22.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191109_124733_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191109_124733_17.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191109_125634_74.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191109_125634_74.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191109_131624_29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191109_131624_29.png -------------------------------------------------------------------------------- /docs/流程控制/判断/image/20191109_143132_98.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/判断/image/20191109_143132_98.png -------------------------------------------------------------------------------- /docs/流程控制/循环.md: -------------------------------------------------------------------------------- 1 | # 循环 2 | 3 | -------------------------------------------------------------------------------- /docs/流程控制/循环/break.md: -------------------------------------------------------------------------------- 1 | # break 2 | 3 | -------------------------------------------------------------------------------- /docs/流程控制/循环/continue.md: -------------------------------------------------------------------------------- 1 | # continue 2 | 3 | -------------------------------------------------------------------------------- /docs/流程控制/循环/for.md: -------------------------------------------------------------------------------- 1 | # for 2 | 3 | ## 基本语法 4 | 5 | ``` 6 | for 变量 in 串行 7 | do 8 | 命令区域 9 | done 10 | ``` 11 | 12 | * 将串行元素依次去除,存放到指定名称的变量中,重复执行命令区域,直到所有元素取尽位置。 13 | * 串行是一些字符串的组合,彼此用**$IFS**所定义的字符隔开,这些字符串成为字段 14 | 15 | ## 举栗子 16 | 17 | ### 最基本计数for循环 18 | 19 | ``` 20 | for i in 1 2 3 4 5 6 7 8 21 | do 22 | echo $i 23 | done 24 | 25 | 或者 26 | 27 | for i in 1 2 3 4 5 6 7;do echo $i;done 28 | 29 | ``` 30 | 31 | ### for输出参数 32 | 33 | ``` 34 | for i in $@ 35 | do 36 | echo $i 37 | done 38 | 39 | 或者 40 | 41 | for i in $@ ;do echo $i;done 42 | ``` 43 | 44 | 45 | ![20191111_200731_64](image/20191111_200731_64.png) 46 | 47 | ![20191111_200819_66](image/20191111_200819_66.png) 48 | 49 | ![20191111_200841_60](image/20191111_200841_60.png) 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | --- 60 | -------------------------------------------------------------------------------- /docs/流程控制/循环/image/20191111_200731_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/循环/image/20191111_200731_64.png -------------------------------------------------------------------------------- /docs/流程控制/循环/image/20191111_200819_66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/循环/image/20191111_200819_66.png -------------------------------------------------------------------------------- /docs/流程控制/循环/image/20191111_200841_60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/循环/image/20191111_200841_60.png -------------------------------------------------------------------------------- /docs/流程控制/循环/image/20191114_163825_68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/流程控制/循环/image/20191114_163825_68.png -------------------------------------------------------------------------------- /docs/流程控制/循环/until.md: -------------------------------------------------------------------------------- 1 | # until 2 | 3 | -------------------------------------------------------------------------------- /docs/流程控制/循环/while.md: -------------------------------------------------------------------------------- 1 | # while 2 | 3 | ``` 4 | while 条件测试 5 | do 6 | 命令区域 7 | done 8 | 9 | 或 10 | 11 | while 条件测试;do 命令区域;done 12 | 13 | ``` 14 | 15 | ## 举栗子 16 | 17 | ### 简单计数 18 | 19 | ``` 20 | declare -i i=0 ; while ((i<=10));do let i++; echo $i ;done 21 | 22 | 或 23 | 24 | declare -i i=0 25 | while ((i<=10)) 26 | do 27 | let i++ 28 | echo $i 29 | done 30 | ``` 31 | 32 | ![20191114_163825_68](image/20191114_163825_68.png) 33 | 34 | ### 读取文件 35 | 36 | ``` 37 | while read line ;do echo $line;done < /proc/cpuinfo 38 | 39 | 或 40 | 41 | 42 | while read line 43 | do 44 | echo $line 45 | done < /proc/cpuinfo 46 | 47 | ``` 48 | -------------------------------------------------------------------------------- /docs/环境变量.md: -------------------------------------------------------------------------------- 1 | # 第6章-使用Linux环境变量 2 | 3 | -------------------------------------------------------------------------------- /docs/环境变量/image/20191109_104652_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/环境变量/image/20191109_104652_17.png -------------------------------------------------------------------------------- /docs/环境变量/image/20191109_122817_38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/环境变量/image/20191109_122817_38.png -------------------------------------------------------------------------------- /docs/环境变量/image/20191109_152632_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/环境变量/image/20191109_152632_24.png -------------------------------------------------------------------------------- /docs/环境变量/image/20191109_153249_26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/环境变量/image/20191109_153249_26.png -------------------------------------------------------------------------------- /docs/环境变量/image/20191109_153302_69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/环境变量/image/20191109_153302_69.png -------------------------------------------------------------------------------- /docs/环境变量/image/20191109_153636_57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/docs/环境变量/image/20191109_153636_57.png -------------------------------------------------------------------------------- /docs/环境变量/shell保留关键字.md: -------------------------------------------------------------------------------- 1 | # shell保留关键字 2 | 3 | ## 如何查看shell保留的关键字 4 | 5 | 1. 通过compgen命令显示shell保留的关键字 6 | 7 | ``` 8 | compgen -k 9 | ``` 10 | 11 | ![20191109_122817_38](image/20191109_122817_38.png) 12 | 13 | * 22个关键字,变量命名的时候不得使用 14 | 15 | ``` 16 | if 17 | then 18 | else 19 | elif 20 | fi 21 | case 22 | esac 23 | for 24 | select 25 | while 26 | until 27 | do 28 | done 29 | in 30 | function 31 | time 32 | { 33 | } 34 | ! 35 | [[ 36 | ]] 37 | coproc 38 | ``` 39 | 40 | * coproc 是什么? 41 | 42 | --- 43 | -------------------------------------------------------------------------------- /docs/环境变量/位置参数.md: -------------------------------------------------------------------------------- 1 | # 位置参数 2 | 3 | -------------------------------------------------------------------------------- /docs/环境变量/删除变量.md: -------------------------------------------------------------------------------- 1 | # 删除变量 2 | 3 | -------------------------------------------------------------------------------- /docs/环境变量/变量类型.md: -------------------------------------------------------------------------------- 1 | # 变量类型 2 | 3 | -------------------------------------------------------------------------------- /docs/环境变量/变量赋值.md: -------------------------------------------------------------------------------- 1 | # 变量赋值 2 | 3 | -------------------------------------------------------------------------------- /docs/环境变量/标准变量.md: -------------------------------------------------------------------------------- 1 | # 标准变量 2 | 3 | -------------------------------------------------------------------------------- /docs/环境变量/特殊变量.md: -------------------------------------------------------------------------------- 1 | # 特殊变量 2 | 3 | 4 | 5 | | 特殊变量 | 作用 | 6 | | -------- | ------------------------------------------------ | 7 | | $0 | 当前脚本的文件名(不带路经,带扩展名 .sh )xx.sh | 8 | | $NUM | 返回第NUM个参数。( n>0 ) | 9 | | $# | 统计传入的变量个数  e.g. ./xx.sh p1 p2     输出2 | 10 | | $* | 列出所有参数 。" $* " 整体列出 | 11 | | $@ | 列出所有参数 。"$@" 一一列出 | 12 | | $? | 返回上一个命令执行的返回码 | 13 | | $$ | 返回当前shell进程pid | 14 | | $! | 最后运行的后台Process的pid | 15 | | $- | 列出Set命令设定的Flag | 16 | 17 | 18 | 19 | ## $*与$@区分 20 | 21 | * $* 是一个**列表**,内容分别是 $1 $2 $3 22 | * $* 环绕双引号的时候 "$*" 是一个**整体** "$1 $2 $3" 23 | * $@ 是一个**列表**,内容分别是 $1 $2 $3 24 | * $@ 环绕双引号的时候 "$@" 是一个**列表** "$1" "$2" "$3" 25 | * 总之,没有引号都是列表,有引号$*是整体,$@是列表。$@永远都是列表,$*只在有引号的时候是整体 26 | 27 | 举栗子: 28 | 29 | ``` 30 | #!/bin/bash 31 | 32 | echo " \$*=" $* 33 | echo "\"\$*\"=" "$*" 34 | 35 | echo " \$@=" $@ 36 | echo "\"\$@\"=" "$@" 37 | 38 | echo "print each paramter from \$*" 39 | for var in $*;do 40 | echo "$var" 41 | done 42 | 43 | echo "print each paramter from \$@" 44 | for var in $@;do 45 | echo "$var" 46 | done 47 | 48 | echo "print each paramter from \"\$*\"" 49 | for var in "$*";do 50 | echo "$var" 51 | done 52 | 53 | echo "print each paramter from \"\$@\"" 54 | for var in "$@";do 55 | echo "$var" 56 | done 57 | ``` 58 | 59 | ![20191109_104652_17](image/20191109_104652_17.png) 60 | 61 | 62 | 63 | ## 参考 64 | 65 | * 66 | -------------------------------------------------------------------------------- /docs/环境变量/预定义变量.md: -------------------------------------------------------------------------------- 1 | # 预定义变量 2 | 3 | -------------------------------------------------------------------------------- /image/20200127_164206_47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/image/20200127_164206_47.png -------------------------------------------------------------------------------- /image/20210708_224801_51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yifengyou/bash/404bcaf5ffec3a72abe5b872268b9136a6a0d11b/image/20210708_224801_51.png --------------------------------------------------------------------------------