前言其实你现在看到的是文章的第三版(几乎全部重构)。记得写第一版的时候,我还是个“参赛者”。输掉比赛后,我和朋友一起做起了IDC生意。第二次改的时候发现两三个月阅读量直接在自己的网站上从top变成了***。此外,我还参与了开源社区并维护了LCTT-CLI项目。***第三次就是这次,因为我通过了RHCE模拟考试加上一年多的积累。所以这次的内容或者版面应该是最好的!BTW:这篇文章仍然是我博客IT兄弟会阅读次数最多的!当初写这篇文章是因为兼职创业IDC公司运维需要一点shell脚本来满足一定的需求。虽然现在是Python的时代。我如何理解Python和Shell?以游泳为例:前者是正规的游泳池,有正规教练陪同;后者是农村的一个小湖,麻雀虽小,五脏俱全。人工智能选择的Python势必无人能挡,经典的Shell也相当讲究。比如我之前写Shell的时候,用了很多ifelse语句,case语句,test语句。我知道||&&;后来学了很多比较运算符,但大部分还是在积累命令和条件语句的数量。现在,我开始思考命令与命令的关系、语句分隔符的含义、BASH控制结构等等。所以今天跟大家分享的主要是“命令替换”和“参数扩展”。什么是命令替换?简单的说就是在SHELL中嵌套多条命令,一次性执行得到结果。1.一层SHELL嵌套#echo`whoami`#echo$(whoami)#echo"hello,`whoami`"#echo"hello,$(whoami)"2.两层SHELL嵌套#echo`cat./gn2.txt`|sed-s"s;$;--list;"使用``读取文件内容,然后使用管道符进行二次处理。实施!注意:这里已经使用了一层嵌套,后面的章节将应用实现两层嵌套。A。使用“$()”进行两层嵌套b.使用“|”用于指挥指导c.一些问题的注意事项和答案。可能有读者注意到,之前在简单shell的一级嵌套中提到了嵌套。还有一个。那为什么不用``来嵌套呢。根本原因是:``不支持嵌套执行命令!强制执行。只能识别***组,其余按空格为间隔执行或按竖线符(含)执行,直至结束。比较旧。容易与“单引号”混淆。就是美式键盘左上角ESC下方的~反引号键!备选方案可用。$(...)格式受POSIX标准支持,也适合嵌套。$()可以像$($($()))那样嵌套多层,但是如果里面有``也可以执行(出于兼容性原因)!3、在进阶之前,我们介绍了``和$(...),这两个命令是执行的。现在你一定对命令执行有了更深的理解。现在,我们需要更进一步~1。(cmd)和{var}关于()和{}和命令替换一样,是shell扩展父类下的相关概念。提示:{}左大括号右侧必须有一个空格,尾大括号左侧必须有一个分号。#(echofire;echosecond;)#{echothird;echofourth;}注意:()只是为一系列命令重新打开一个子shell,{}在当前shell中执行一系列命令。2.()和{}带来的影响()括号内的语句在括号#var=source#(echo$var;var=global;echo$var;)#echo$varb。{}括号语句影响全局。#echo$var#{echo$var;var=global;echo$var;}#echo$var注意:{}改变了var的变量后,external也会受到影响。什么是参数展开参数展开的基本格式是${parameter},展开的结果是${parameter}被替换成对应的值。1、例子1echo$1$11echo$1${11}先解释一下${1..9}是什么意思。我们在写Shell的时候,免不了要传递参数来实现自定义变量。当超过阿拉伯数字9或更晚时。您需要使用${parameter}明确告诉Shell第11个参数是${11}。提示:上图显示101是因为$11不满足[1-9]{1}。系统将11拆分为$1和1,所以运算后的结果为101。2.例2ban=banechoa$bananaechoa${ban}ana本例中我要输出banana。一个ban变量已经定义为ban,加ana就变成“笨啦啦”。但是显然不加{},是不可能让变量$ban配合ana显示banana的!什么是变量展开从官方的定义来看,我不应该无中生有地做“变量展开”。“$字符引入了参数扩展、命令替换或算术扩展。”-官方手册主要有两个原因:大部分被接受。国内出现了大量“变扩”的文章,大多数人都接受了这个名字。容易明白。参数是${...}括号内的东西,变量一词可以表示所有操作都围绕变量进行。便于记录。分词后,对本文的排版会有帮助。也可以从初级、中级、高级分为一定的级别。例子:var='Thisisonetestsentence.'var1=parametervar2=word既然有了这样一个句子,希望能做一些判断,提取(或者说:slice)或者修改。我该怎么做?1.变量替换${parameter:-word}#echo${var1:-$var2}parameter#var1=#echo${var1:-$var2}word如果var1未设置或为空,则将其替换为var2。b.${parameter:=word}同上。不能以这种方式分配位置参数和特殊参数。C。${parameter:?word}#var1=#echo${var1:?var2}bash:var1:var2#echo$?1当变量var1没有设置或者为空,shell是交互式的时候,会报错并退出。如果shell不是交互式的,则会发生变量替换。d.${parameter:+word}#echo$var1parameter#echo$var2word#echo${var1:+$var2}word#echo$var1parameter如果var1为空或未设置,则什么都不做。否则使用var2进行替换。提示:我在测试的时候,发现不是全局生效的。2.可变切片a。Rangeslice(samedirection)#echo${var:8:17}onetestsentence注:两个数都是从头开始数。b.范围切片(不在同一方向)#echo${var:8:-1}onetestsentence#echo${var:8:(-1)}onetestsentence提示:两种写法都是正确的。C。切片位置#a='Thisisone'#echo${#a}11Tips:先创建变量a='Thisisone',然后用echo${#a}读出字符数。3.变量修改简单修改#echo${var}Thisisonetestsentence.#echo${var/one/a}Thisisatestsentence.提示:个人认为这是最好的方式,可以在一个范围内修改(包括删除)。b.只需删除#echo${var%sentence.}Thisisonetest#echo${var#Thisis}onetestsentence.c。附:表格<如果显示不完整,请左右滑动>变量设置方法说明${Variable#keyword}如果变量内容开头的数据与“关键字”匹配,则删除最短的匹配数据${variable##keyword}如果从变量内容开始的数据匹配到“关键字”,则删除匹配的最短数据删除最长的数据${variable%keyword}如果从变量内容末尾的数据匹配到“keyword”,删除最短的匹配数据${variable%%keyword}如果变量内容末尾的数据满足“keyword”关键字,则删除最长的匹配数据${variable/oldstring/newstring}如果变量内容与“旧字符串”匹配,***旧字符将被新字符替换。${variable/oldstring//newstring}如果变量内容与“旧字符串”匹配,则所有旧字符将被替换为新角色。更深入,通过示例探索Bash,第二部分Bash参考手册:Bash参考手册Shell-ExpansionsChapter:Shell-ExpansionsShellParameterExpansionChapterShellParameterExpansion
