Shell 中的命令替换及参数扩展 | Linux 中国
2017-12-23 00:00
666 查看
今天和大家分享的主要是 “命令替换” 以及 “参数扩展” 。-- 季文康
本文导航◈ 前言00%◈ 什么是命令替换14%◈ 1、一层 SHELL 嵌套15%◈ 2、二层 SHELL 嵌套17%◈ 3、进阶30%◈ 什么是参数扩展44%◈ 1、实例一46%◈ 2、实例二52%◈ 什么是变量扩展57%◈ 1、变量替换65%◈ 2、变量切片74%◈ 3、变量修改80%◈ 更深入学习,探索资料95%转载自 | http://www.cnblogs.com/itxdm/p/something_of_shellscirpt.html
作者 | 季文康前言其实,你现在阅读到的是第三版的文章(几乎全部重构)。记得我写第一版的时候,还是一名 “参赛选手”。后来比赛失利便和朋友一起做 IDC 创业。第二次改的时候,是我发现阅读量在俩三个月内直接自己站点 top 到第一,加上参与了开源社区,维护了 LCTT-CLI 项目。最后第三次也就是这次,是因为通过了 RHCE 模拟考加上一年多积累。所以这次的内容或是排版都应是最棒!BTW:这篇文章在我的博客IT兄弟盟[2],依旧是第一的阅读量!一开始写这篇文章是因为兼职创业 IDC 公司运维,需要一点 shell script 来实现某些需求。虽然现在已经是 Python 的时代了。插个话题,我怎么理解 Python 和 Shell 呢?拿游泳来做个比喻:前者是正规游泳馆,有正规教练辅助相伴;后者是乡下小湖泊,麻雀虽小五脏俱全。人工智能选中的 Python 势必锋不可当,经典的 Shell 也相当精妙绝伦。比如以前我写 Shell 的时候用了很多
if else语句、
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 扩展父类下的相关概念。提示:
{}头部大括号右侧必须有一个空格,尾部括号左侧必须有分号结尾。
# ( 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 }被替换为相应的值。1、实例一
echo $1 $11
echo $1 ${11}
首先解释下
${1..9}是什么意思。在我们写
Shell时必不可免的需要传递参数以实现自定义变量。当超过阿拉伯数字
9以后。就需要使用
${ parameter }明确告诉
Shell第
11个参数是
${11}。提示:上图显示
101就是因为
$11不满足
[1-9]{1}。系统将
11拆分成
$1和
1,所以运算后结果是
101。2、实例二
ban=ban
echo a $banana
echo a ${ban}ana
这个实例中,我想输出
banana。已经定义了一个
ban的变量为
ban,只要加上
ana就可以成为 “笨啦啦”。但是很显然的不加
{}是无法做到使变量
$ban配合
ana显示出
banana的!什么是变量扩展从官方定义上来说,我并不应该将 “变量扩展” 无中生有出来。"
$字符引入参数扩展,命令替换或算术扩展。" —— 官方手册主要是出于俩个方面考虑:◈ 多数接受。国内出现了大量 ”变量扩展“ 的文章,多数人已经接受这个名称。◈ 便于理解。参数就是
${...}括号内的东西,而变量一词可表示所有操作围绕变量展开。◈ 便于记录。切分以后,对写这篇文章的排版有帮助。亦可以从基础、中级、高级有一定水平划分。实例:
var='This is one test sentence.'
var1=parameter
var2=word
现在我们有了这样的一个句子,我希望做一些判断、摘取(或者说:切片)或修改。我该如何操作?1、变量替换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 $var1
parameter
# echo $var2
word
# echo ${var1:+$var2}
word
# echo $var1
parameter
如果
var1为空或未设置,那么就什么都不做。不然使用
var2进行替换。提示: 在我测试的时候,我发现并不是全局生效的。2、变量切片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}将字符数量读了出来。3、变量修改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. 附:表格< 如显示不全,请左右滑动 >
变量设置方式 | 说明 |
---|---|
${变量#关键字} | 若变量内容从头开始的数据符合“关键字”,则将符合的最短数据删除 |
${变量##关键字} | 若变量内容从头开始的数据符合“关键字”,则将符合的最长数据删除 |
${变量%关键字} | 若变量内容从尾开始的数据符合“关键字”,则将符合的最短数据删除 |
${变量%%关键字} | 若变量内容从尾开始的数据符合“关键字”,则将符合的最长数据删除 |
${变量/旧字符串/新字符串} | 若变量内容符合“旧字符串”,则首个旧字符会被新字符替换。 |
${变量/旧字符串//新字符串} | 若变量内容符合“旧字符串”,则全部旧字符会被新字符替换。 |
点击图片、输入文章 ID 或识别二维码直达原文链接请访问“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。
相关文章推荐
- Shell 中的命令替换及参数扩展
- Linux下Shell脚本中几种基本命令的替换区别
- linux 下c/c++ 使用shell命令并加入参数、保存结果
- Linux中的shell命令参数详解
- [Linux] shell read 命令参数 -p用法 [大三TJB_708]
- Linux--Shell 编程-bash,命令替换,if分支嵌套,运算,输入输出
- Linux(7) 常用命令扩展 改变用户环境变量 (可以实现登陆就执行shell脚本)
- Linux下Shell脚本中几种基本命令的替换区别
- Linux系统的rm命令太危险,一不小心就会删除系统文件。写一个shell脚本来替换系统的rm命令,
- Linux--Shell 编程-bash,命令替换,if分支嵌套,运算,输入输出
- Shell命令中的扩展和替换
- linux命令(while,shell参数的用法)
- Linux中模拟shell实现ls命令(不加参数)
- Linux 下Shell 脚本几种基本命令替换区别
- [Linux] shell read 命令参数 -p用法
- [Linux] shell read命令 参数 -t -n -s记录
- [Linux] shell read命令 参数 -t -n -s记录 [大三TJB_708]
- [Linux]:Bash shell字符串截取及命令替换
- linux chsh命令参数及用法详解(linux设置系统shell命令) !!!
- linux chsh命令参数及用法详解(linux设置系统shell命令)