这篇文章主要为大家展示了“Shell中命令替换的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Shell中命令替换的示例分析”这篇文章吧。
简单的来说就是在 SHELL 内嵌套多条命令,一次性执行得到结果。
# echo `whoami`# echo $(whoami) # echo "hello,`whoami`"# echo "hello,$(whoami)"
# echo `cat ./gn2.txt` | sed -s "s;$; --list;"
使用 ``
读取文件内容,再使用管道符二次处理后。执行!
注意:这里已经用了一层嵌套,以下多个小节会套用以实现二层嵌套。
a. 使用 "$()" 进行二层嵌套
b. 使用 "|" 进行命令导向
c. 注意事项以及解答一些疑问
可能有读者已经注意到了,之前在简单 SHELL 一层嵌套中说了嵌套还有另一种。那为什么不使用 ` `
进行嵌套。
根本的原因是:` `
不支持命令嵌套执行!
强制执行。也只能认出***组,其余按照空格作为间隔各个执行 或 按照管道符(含)直到末尾执行。
比较陈旧。容易与“单引号”混淆。
它是美式键盘左上角 ESC 下面的包含 ~
的反引号键!
已有替代品。$(...)
格式受到POSIX标准支持,也利于嵌套。
$()
可以多层嵌套类似 $($($()))
,但如果内部有一个` `
也是可以执行的哟(出于兼容考虑)!
之前我们介绍了
``
和$(...)
,这俩种命令执行。想来现在你一定对命令执行有比较深的理解了。现在,我们需要再进阶一下~
1、 (cmd)
与 {var}
关于 ( )
与 { }
,和 命令替换
一样都是 shell 扩展
父类下的相关概念。
提示:{}
头部大括号右侧必须有一个空格,尾部括号左侧必须有分号结尾。
# ( echo firest;echo second; )# { echo third;echo fourth; }
注意: ( )
只是对一串命令重新开一个 子 shell 进行执行, { }
对一串命令在 当前 shell 执行。
2、()
与 {}
造成的影响
a. ()
括号内的语句影响在括号内
# var=source# ( echo $var;var=global;echo $var; )# echo $var
b. {}
括号内的语句影响到全局。
# echo $var# { echo $var;var=global;echo $var; }# echo $var
注意:{}
改变 var
的变量以后,外部也受到了影响。
参数扩展的基本格式是 ${ parameter }
,扩展的结果是 ${ parameter }
被替换为相应的值。
echo $1 $11echo $1 ${11}
首先解释下 ${1..9}
是什么意思。在我们写 Shell
时必不可免的需要传递参数以实现自定义变量。当超过阿拉伯数字 9
以后。就需要使用 ${ parameter }
明确告诉Shell
第 11
个参数是 ${11}
。
提示:上图显示 101
就是因为 $11
不满足 [1-9]{1}
。系统将 11
拆分成 $1
和 1
,所以运算后结果是 101
。
ban=banecho a $bananaecho a ${ban}ana
这个实例中,我想输出 banana
。已经定义了一个 ban
的变量为 ban
,只要加上 ana
就可以成为 “笨啦啦”。
但是很显然的不加 {}
是无法做到使变量 $ban
配合 ana
显示出 banana
的!
从官方定义上来说,我并不应该将 “变量扩展” 无中生有出来。
"
$
字符引入参数扩展,命令替换或算术扩展。" —— 官方手册
主要是出于俩个方面考虑:
多数接受。国内出现了大量 ”变量扩展“ 的文章,多数人已经接受这个名称。
便于理解。参数就是 ${...}
括号内的东西,而变量一词可表示所有操作围绕变量展开。
便于记录。切分以后,对写这篇文章的排版有帮助。亦可以从基础、中级、高级有一定水平划分。
实例:
var='This is one test sentence.'var1=parametervar2=word
现在我们有了这样的一个句子,我希望做一些判断、摘取(或者说:切片)或修改。我该如何操作?
a. ${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
进行替换。
提示: 在我测试的时候,我发现并不是全局生效的。
a. 范围切片(同方向)
# echo ${var:8:17}one test sentence
注意:俩个数字都是从头开始数的。
b. 范围切片(非同向)
# echo ${var:8:-1}one test sentence# echo ${var:8:(-1)}one test sentence
提示:俩种写法都是正确的。
c. 切片位置
# a='This is one'# echo ${#a}11
提示 :首先建立变量 a='This is one'
,然后使用 echo ${#a}
将字符数量读了出来。
a. 简单修改
# echo ${var}This is one test sentence.# echo ${var/one/a}This is a test sentence.
提示:个人认为这种是***的方式了,可以范围式修改(包含删除)。
b. 简单删除
# echo ${var%sentence.}This is one test
# echo ${var#This is}one test sentence.
c. 附:表格
变量设置方式 | 说明 |
---|---|
${变量#关键字} | 若变量内容从头开始的数据符合“关键字”,则将符合的最短数据删除 |
${变量##关键字} | 若变量内容从头开始的数据符合“关键字”,则将符合的最长数据删除 |
${变量%关键字} | 若变量内容从尾开始的数据符合“关键字”,则将符合的最短数据删除 |
${变量%%关键字} | 若变量内容从尾开始的数据符合“关键字”,则将符合的最长数据删除 |
${变量/旧字符串/新字符串} | 若变量内容符合“旧字符串”,则***旧字符会被新字符替换。 |
${变量/旧字符串//新字符串} | 若变量内容符合“旧字符串”,则全部旧字符会被新字符替换。 |
以上是“Shell中命令替换的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。