Loading... <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><strong>一、shell是什么?</strong></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> <strong style="font-size: 16px">Shell</strong><span style="font-size: 16px">本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。</span></span></p> <p><span style="font-size: 16px;font-family: 楷体, 楷体_GB2312, SimKai"> 如图shell是一个应用程序,是用户管理应用程序的一个接口。</span></p> <p><span style="font-size: 16px;font-family: 楷体, 楷体_GB2312, SimKai"><img src="//cto.wang/usr/uploads/2016/07/20160703161023-61.gif" title="2016-03-05 21 48 45_看图王.png" alt="wKioL1ba5wXDNSCsAABtio430hE601.png" /></span></p> <p><strong><span style="font-family: 楷体, 楷体_GB2312, SimKai">二、广义上shell的分类</span></strong></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> GUI:图形用户界面</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> KDE,GNOME,XFCE</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> CLI:命令行接口</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> bash, zsh, fishsh, csh, tcsh, ksh</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai">在大多发行版中常用的为bash</span></p> <p><span style="font-size: 16px"><strong><span style="font-family: 楷体, 楷体_GB2312, SimKai">三、bash的特性</span></strong></span></p> <p><span style="font-size: 16px;font-family: 楷体, 楷体_GB2312, SimKai">bash是弱类型的编程语言,不严格区分数据类型,意味把所有数据统统当作字符串处理;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>字符串类型的数据可不加引号; </span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>引号有三种类型:', ", `</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>', ":字符引用</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>': 强引用,其内部的变量不会被替换; </span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>":弱引用,其内部的变量会被替换;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>`:命令引用</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>变量引用:${NAME}</span></p> <p><strong><span style="font-family: 楷体, 楷体_GB2312, SimKai">a、bash特性之一:命令别名</span></strong></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai;font-size: 16px"> 获取当前用户可用的别名的定义:</span></p> <pre class="brush:bash;toolbar:false"># alias</pre> <p> <span style="font-family: 楷体, 楷体_GB2312, SimKai">定义别名:</span></p> <pre class="brush:bash;toolbar:false"># alias NAME='COMMAND'</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 生命周期:当前shell进程;</span><br /><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p> <span style="font-family: 楷体, 楷体_GB2312, SimKai">撤消别名:</span></p> <pre class="brush:bash;toolbar:false"># unalias NAME</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><strong><span style="font-family: 楷体, 楷体_GB2312, SimKai">b、bash的特性之二:命令历史</span></strong></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> shell进程会保存其会话中用户曾经执行过的命令;命令通过其“历史文件”来持久保存此前执行过的命令;每个用户都有其自己专用的历史文件;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>HISTSIZE:shell进程的缓冲区保留的历史命令的条数;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>HISTFILESIZE:命令历史文件可保存的历史命令的条数;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>默认均为1000; </span></p> <pre class="brush:bash;toolbar:false"># echo $HISTSIZE 1000 # echo $HISTFILESIZE 1000</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> HISTFILE:当前用户的命令历史文件;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>~/.bash_history</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai">查看命令历史列表:</span></p> <pre class="brush:bash;toolbar:false"># history</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 命令用法:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>history -c:清空命令历史;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>history -d OFFSET:删除指定的条目;</span></p> <pre class="brush:bash;toolbar:false"># history -d 156</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>-a 将当前缓冲的历史行追加到历史文件中</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>-n 从历史文件中读取所有未被读取的行</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>-r 读取历史文件并将内容追加到历史列表中</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">调用命令历史列表中的命令以重执行之目的:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>!#:再一次执行历史列表中的第#条命令;</span></p> <pre class="brush:bash;toolbar:false"># history .... 72 cat test 73 history # !72 cat test Hello World</pre> <p><span class="Apple-tab-span" style="font-family: 楷体, 楷体_GB2312, SimKai"> </span><span style="font-family: 楷体, 楷体_GB2312, SimKai">!!:再一次执行上一条命令;</span></p> <pre class="brush:bash;toolbar:false"># cat test Hello World # !! cat test Hello World</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> !STRING:再一次执行命令历史列表中最近一个以指定的STRING开头的命令;</span></p> <pre class="brush:bash;toolbar:false"># !cat cat test Hello World</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 调用上一条命令的最后一个参数:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>快捷键:ESC, .</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span> Alt+.</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>!$:给出的字符组合</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> </span><span style="font-family: 楷体, 楷体_GB2312, SimKai">显示最近的n条件命令历史:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>history #</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> </span><span style="font-family: 楷体, 楷体_GB2312, SimKai">控制命令历史的记录方式:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>通过HISTCONTROL环境变量进行,其取值:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>ignoredups:忽略重复的命令;重复是指连续且相同的令;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>ignorespace:以空白字符开头的命令不记入历史;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>ignoreboth:上述两者同时生效;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> </span><span style="font-family: 楷体, 楷体_GB2312, SimKai">修改变量值的方式:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>NAME='VALUE'</span></p> <pre class="brush:bash;toolbar:false"># echo $HISTCONTROL ignoredups # HISTCONTROL="ignoreboth" # echo $HISTCONTROL ignoreboth</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><strong><span style="font-family: 楷体, 楷体_GB2312, SimKai">c、bash特性之三:快捷键 </span></strong></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>Ctrl+a:跳至命令行首;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>Ctrl+e:跳至命令行尾;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>Ctrl+k:删除光标所在处至尾部的内容;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>Ctrl+u:删除行首至光标所在处的内容;</span></p> <p><strong><span style="font-family: 楷体, 楷体_GB2312, SimKai">d、bash的特性之四:命令补全和路径补全</span></strong></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 命令补全:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>shell程序在接收到用户执行命令的请求且分析完成之后,最左侧字符串将被当作命令去查找;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 查找机制:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>(1) 查找内部命令;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>(2) 查找外部命令:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>1、去$PATH变量所指定的各路径下,自左而右逐个搜索各目录下的文件名;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>2、给定的打头的字符串如果能惟一标识某命令程序文件的文件名,则直接补全;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>3、<span class="Apple-tab-span"></span>不能惟一标识,再击tab可给列表;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>4、错误:没有任何命令可被此打头字符串标识;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 路径补全:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>在给定的起始路径的上级目录下,以对应路径下的打头字符串来逐一匹配上级目标下的每个文件:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>惟一标识:tab补全;</span></p> <p><span class="Apple-tab-span" style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">不能惟一标识:tab, tab给出列表;</span></p> <p><span class="Apple-tab-span" style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">错误路径:没有响应;</span></p> <p><strong><span style="font-family: 楷体, 楷体_GB2312, SimKai">e、bash的特性之五:命令行展开:</span></strong></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 把命令行的给定的特殊符号自动替换为相应字符串的机制;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">~: 自动替换为用户家目录;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>~USERNAME:自动替换为指定用户的家目录;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>{}:可承载一个以逗号分隔的路径列表,能够将其展开为多个独立路径;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 例如:<br /></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> /tmp/{a,b,c} /tmp/a /tmp/b /tmp/c<br /></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> /tmp/{a,b}/z /tmp/a/z /tmp/b/z<br /></span></p> <pre class="brush:bash;toolbar:false"># cd ~ # pwd /root # cd ~testuser testuser]# pwd /home/testuser</pre> <p><strong><span style="font-family: 楷体, 楷体_GB2312, SimKai">f、bash特性之六:命令的执行状态结果:</span></strong></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>命令的正常输出结果:命令的返回值;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>通过引用来保存下来或直接调用——”命令引用“</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>`COMMAND`</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>$(COMMAND)</span></p> <pre class="brush:bash;toolbar:false"># ls -ld `pwd`</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">命令的执行状态结果:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>成功:0</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>失败:1-255</span></p> <pre class="brush:bash;toolbar:false"># echo "Helllo World" Helllo World # echo $? 0 # echoa "Hello World" -bash: echoa: command not found # echo $? 127</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> bash用一个特殊变量来保存最一次执行的命令的状态结果:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>$?</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>bash中的引用:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>'':强引用</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>"":弱引用</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>“:命令引用</span></p> <pre class="brush:bash;toolbar:false"># echo '$PATH' $PATH # echo "$PATH" /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # echo `pwd` /home/testuser</pre> <p><strong><span style="font-family: 楷体, 楷体_GB2312, SimKai">g、bash的特性之七:glob</span></strong><span style="font-family: 楷体, 楷体_GB2312, SimKai"><br /></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> glob:文件名通配;快速引用多个文件;文件名整体匹配度检测; </span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 元字符:基于元字符可编写匹配模式(pattern);</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> *:匹配任意长度的任意字符;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>p*, pa*, *p, *p*a</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>p*:pa, p</span><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>?:匹配任意单个字符;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>p?, p?a, p??</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>p??: pa, pad, </span></p> <p><span class="Apple-tab-span" style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">[ ]:匹配指定集合内的任意单个字符;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>[a-z], [A-Z]:不区分字符大小写;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>[0-9]</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>[a-z0-9]</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> </span><span style="font-family: 楷体, 楷体_GB2312, SimKai">[[:upper:]]:所有大写字母;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>[[:lower:]]:所有小写字母;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>[[:digit:]]:所有的数字;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>[[:alpha:]]:所有字母;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>[[:alnum:]]:所有字母和数字;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>[[:space:]]:空白字符;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>[[:punct:]]:标点符号;</span><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>[^ ]:匹配指定集合外的任意单个字符;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>[^[:alpha:]]</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 测试:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 1、显示/etc目录下,以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录; </span></p> <pre class="brush:bash;toolbar:false"> ls -d /etc/[^[:alpha:]][a-z]*</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 2、复制/etc目录下,所以n开头,以非数字结尾的文件或目录至/tmp/etc目录下;</span></p> <pre class="brush:bash;toolbar:false"> mkdir /tmp/etc cp -r /etc/n*[^0-9] /tmp/etc/</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 3、显示/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录;</span><br /><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <pre class="brush:bash;toolbar:false"> ls -d /ur/share/man/man[0-9]</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 4、复制/etc目录下,所以p,m,r开头的,且以.conf结尾的文件或目录至/tmp/conf.d目录下;</span></p> <pre class="brush:bash;toolbar:false"> mkdir /tmp/conf.d/ cp -r /etc/[pmr]*.conf /tmp/conf.d/</pre> <p><strong><span style="font-family: 楷体, 楷体_GB2312, SimKai">h、bash特性之八:变量</span></strong></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>程序:指令+数据</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>数据:文件、变量;</span><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>变量:内存空间,有名称,名称即为变量名,对应的内存空间中的数据即为变量的值;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> </span><span style="font-family: 楷体, 楷体_GB2312, SimKai">变量赋值:NAME=VALUE</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>=:赋值符号;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>把VALUE存储到NAME指向的内存空间中;</span><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>编程语言:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>强类型:严格区分变量中的数据类型;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>弱类型:不区分变量中存储的数据类型,统一为字符型;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>bash:统统默认为字符型数据;变量无需事先声明;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">变量为什么有类型?</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>存储空间、存储格式、参与的运算、……</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> 类型不同决定对数据的处理方式不同</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>变量命名:只能使用字母、数字和下划线;而且不能以数字开头;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><br /></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>变量名:见名知义;不能使用程序保留字,例如if、case、then、fi、esac、for、while、until、break、continue等等;</span></p> <p></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>变量引用:${NAME}, $NAME</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>变量替换:把变量引用符号出现的位置替换为其指向的内存空间中的数据;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span class="Apple-tab-span" style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">bash变量种类:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>本地变量:作用域为当前shell进程;不包括其子进程;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>环境变量:使用域为当前shell进程及其子进程;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>局部变量</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> </span><span style="font-family: 楷体, 楷体_GB2312, SimKai">作用域:生效范围,也即可引用到的范围;</span><span class="Apple-tab-span" style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">位置参数变量:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>特殊变量</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>本地变量:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>变量赋值:NAME=VALUE</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>变量引用:$NAME, ${NAME}</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>""</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>查看变量:set</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>撤销变量:unset NAME</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>注意:此处非为变量引用,因此不能使用$;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>所有的本地变量在shell进程终止时,会被自动撤销;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span> </span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>环境变量:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>变量声明和赋值:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>declare -x NAME[=VALUE]</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>export NAME[=VALUE]</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>引用方式:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>${NAME}, $NAME</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>注意:bash内嵌了许多环境变量,名称为全大写字母,例如UID、HOME、PWD、SHELL, PATH, HISTSIZE等等;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>环境变量查看:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>export, declare -x</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>env, printenv</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>撤销环境变量:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>unset NAME</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>只读变量:常量</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>(1) declare -r NAME</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>(2) readonly NAME</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>不支持重新赋值,也不支持撤销操作;</span></p> <pre class="brush:bash;toolbar:false"># declare -r username=`whoami` # echo $username root # unset username -bash: unset: username: cannot unset: readonly variable</pre> <p><strong><span style="font-family: 楷体, 楷体_GB2312, SimKai">i、bash基于特性之九:I/O重定向和管道</span></strong><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>程序的数据流有三个:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>输入数据流: <–,标准输入(stdin),键盘;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>输出数据流:–>,标准输出(stdout), 显示器;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>错误数据流:–>,错误输出(stderr),显示器;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">fd:file descriptor,文件描述符;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>stdin: 0</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>stdout: 1</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>stderr: 2</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>IO重定向:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">输出重定向:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>重定向程序正常执行的结果</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span class="Apple-tab-span" style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">COMMAND > /PATH/TO/SOMEFILE</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>覆盖重定向:覆盖目标文件中的原有内容;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>COMMAND >> /PATH/TO/SOMEFILE</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>追加重定向:追加新产生的内容至目标文件尾部;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">shell的一个功能开关:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span># set -C</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>禁止覆盖输出重定向至已存在的文件;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>注意:此时仍然可以使用“>|”至目标文件; </span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span># set +C</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>关闭上述特性;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">错误重定向:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>重定向错误的执行结果;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">COMMAND 2> /PATH/TO/SOMEFILE</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>错误输出覆盖重定向;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>COMMAND 2>> /PATH/TO/SOMEFILE</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>错误输出追加重定向;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">合并标准输出与错误输出流:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>(1) &>, &>></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>(2) COMMAND > /PATH/TO/SOMEFILE 2>&1</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span> COMMAND >> /PATH/TO/SOMEFILE 2>&1</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">特殊输出目标:/dev/null</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>位桶:bit bucket</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>特殊的输入文件:/dev/zero</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">输入重定向:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>COMMAND < /PATH/FROM/SOMEFILE</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">tr命令:把输出的数据当中的字符,实现对位转换,即把数据中的存在于字符集中的字符,统统转换为字符集2中对应的字符;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>tr – translate or delete characters</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">tr [OPTION]… SET1 [SET2]</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span></span><span style="font-family: 楷体, 楷体_GB2312, SimKai">(1) tr SET1 SET2 < /PATH/FROM/SOMEFILE</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>字符转换</span></p> <pre class="brush:bash;toolbar:false"> # cat test Hello World # cat test |tr 'a-z' 'A-Z' HELLO WORLD</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>(2) tr -d SET1 < /PATH/FROM/SOMEFILE</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>删除</span></p> <pre class="brush:bash;toolbar:false"># cat test Hello World # cat test |tr -d 'ldH' eo Wor</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>COMMAND << :</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>Here Document</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>用法:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>COMMAND << EOF</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>COMMAND > /PATH/TO/SOMEFILE << EOF</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>管道:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>COMMAND1 | COMMAND2 | COMMAND3 | …</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"></span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>练习1:把/etc/passwd文件最后三行信息中所有小写字符改为大写后输出;</span></p> <pre class="brush:bash;toolbar:false"># tail -3 /etc/passwd|tr 'a-z' 'A-Z' TEST1:X:5002:5002::/HOME/TEST1:/BIN/BASH TEST2:X:5003:5003::/HOME/TEST2:/BIN/BASH TEST3:X:5004:5004::/HOME/TEST3:/BIN/BASH</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>练习2:取出/etc/fstab的第6行;</span></p> <pre class="brush:bash;toolbar:false"># head -6 /etc/fstab |tail -1 # Accessible filesystems, by reference, are maintained under '/dev/disk'</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai">练习3:取出/etc目录下所有以p开头的文件或目录,只显示前5个;</span></p> <pre class="brush:bash;toolbar:false"># ls -d /etc/p*|head -5 /etc/pam.d /etc/passwd /etc/passwd- /etc/pinforc /etc/pkcs11</pre> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai">tee命令:</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>tee – read from standard input and write to standard output and files</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"></span>tee [OPTION]… [FILE]…</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"><span class="Apple-tab-span"> </span>-a:使用追加输出,而非覆盖;</span></p> <p><span style="font-family: 楷体, 楷体_GB2312, SimKai"> </span><span style="font-family: 楷体, 楷体_GB2312, SimKai">COMMAND | tee /PATH/TO/SOMEFILE</span></p> <pre class="brush:bash;toolbar:false"> # cat test|tee /tmp/test.cat Hello World # cat /tmp/test.cat Hello World</pre> <p></p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信