Shell脚本中$符号的几种用法小结
作者:杰哥的IT之旅 发布时间:2023-05-16 12:15:38
目录
Shell脚本中$符号的几种用法
1.1 引用变量
1.2 引用脚本或函数参数
1.3 上条命令的返回值
1.4 执行并获取命令输出
1.5 表达式求值
1.6 获取当前进程 ID
1.7 后台运行的最后一个进程 ID
1.8 获取 Shell 选项
shell中$(( ))、$( )、``与${ }的区别
(1)$( )与``(反引号):返回括号中命令的结果
(2)${ }变量替换
最近在学习Shell,发现还有一些知识点需要巩固,这里写出来,加深下印象。
通常情况下,在工作中用的最多的有如下几项:
$ 符号 | 说明 |
---|---|
$0 | Shell 的命令本身 |
1到9 | 表示 Shell 的第几个参数 |
$? | 显示最后命令的执行情况 |
$# | 传递到脚本的参数个数 |
$$ | 脚本运行的当前进程 ID 号 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$! | 后台运行的最后一个进程的 ID 号 |
$- | 显示 Shell 使用的当前选项 |
Shell脚本中$符号的几种用法
今天将通过以上几种选项并做进一步的操作案例;
1.1 引用变量
引用变量时,使用 $ 符号直接来进行引用,以及包括循环变量;
[root@localhost ~]# x=1024
[root@localhost ~]# echo $x
1024
利用双引号 " 将括起来的字符串支持变量插值。
[root@localhost ~]# x=1024
[root@localhost ~]# echo "x = $x"
x = 1024
使用 ${ } 作为单词边界。
[root@localhost ~]# x=1024
[root@localhost ~]# echo "x = ${x}xy"
x = 1024xy
使用 ${#} 获取变量字符串长度。
[root@localhost etc]# s=helloworld
[root@localhost etc]# echo "s.length = ${#s}"
s.length = 10
1.2 引用脚本或函数参数
基于引用脚本的方式,1 表示 Shell 脚本文件名,n 从 2 开始表示第 n 个参数,第 2 个参数是 $2;
[root@localhost ~]# echo 'echo $1 $2 $3' > ping.sh
[root@localhost ~]# cat ping.sh
echo $1 $2 $3
[root@localhost ~]# sh ping.sh 1 2 3
1 2 3
单引号 '' 括起来的字符串不会进行插值,并使用 $# 获取脚本或函数参数的个数;
[root@localhost ~]# echo 'echo $#' > ping.sh
[root@localhost ~]# sh ping.sh 1 2 3
3
1.3 上条命令的返回值
使用 $? 上条命令的返回值。
0:表示没有错误,其他任何数值:表示有错误。
[root@localhost ~]# true 1024
[root@localhost ~]# echo $?
0
[root@localhost ~]# false 2048
[root@localhost ~]# echo $?
1
1.4 执行并获取命令输出
使用 $() 执行并获取命令输出赋值给变量,等于双引号的功能。
[root@localhost ~]# echo `date`
2016年 06月 05日 星期日 12:39:08 CST
[root@localhost ~]# echo $(date)
2016年 06月 05日 星期日 12:39:34 CST
1.5 表达式求值
[root@localhost ~]# echo $[1024 + 2048]
3072
[root@localhost ~]# expr 1024 + 2048
3072
[root@localhost ~]# a=1024
[root@localhost ~]# b=2048
[root@localhost ~]# echo $[ a + b ]
3072
1.6 获取当前进程 ID
使用 $$ 来进行获取当前进程的 ID 号。
[root@localhost ~]# echo $$
55580
1.7 后台运行的最后一个进程 ID
使用 $! 来进行获取后台运行的最后一个进程 ID。
在命令结尾使用 & 可创建后台进程。
[root@localhost ~]# tail -f /root/ping.sh &
[2] 55848
[root@localhost ~]# echo $!
55848
[root@localhost ~]# kill $!
[root@localhost ~]# echo $!
55848
[2]+ 已终止 tail -f /root/ping.sh
1.8 获取 Shell 选项
使用 $- 来进行获取当前 Shell 的选项。
[root@localhost ~]# echo $-
himBH
shell中$(( ))、$( )、``与${ }的区别
说明:
${ }这种形式其实与用法一和二是一样的,属于变量替换的范畴,只不过在变量替换中可以加上大括号,也可以不加大括号。
简而言之:$(( ))属于执行计算公式,等价于$[ ],$( )和` `属于命令替换,${ }属于变量替换
(1)$( )与``(反引号):返回括号中命令的结果
在bash中,$( )与` `(反引号)都是用来作命令替换的,执行括号或者反引号中的命令。
命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行
示例:命令:$ echo today is $(date "+%Y-%m-%d")
,显示:today is 2014-07-01
注:在操作上,这两者都是达到相应的效果,但是建议使用$( ),理由如下:
1)``很容易与''搞混乱,尤其对初学者来说。
2)在多层次的复合替换中,``必须要额外的跳脱处理(反斜线),而$( )比较直观。
最后,$( )的弊端是,并不是所有的类unix系统都支持这种方式,但反引号是肯定支持的。
示例:
# 将cmd1执行结果作为cmd2参数,再将cmd2结果作为cmd3的参数
cmd3 $(cmd2 $(cmd1))
# 如果是用反引号,直接引用是不行的,还需要作跳脱处理
cmd3 `cmd2 \`cmd1\``
(2)${ }变量替换
一般情况下,$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围
示例:
取路径、文件名、后缀
先赋值一个变量为一个路径,如下:
file=/dir1/dir2/dir3/my.file.txt
记忆方法如下:
# 是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配;两个符号是最大匹配
*是用来匹配不要的字符,也就是想要去掉的那部分
还有指定字符分隔号,与*配合,决定取哪部分
来源:https://juejin.cn/post/7000504587887050788
猜你喜欢
- 我们在浏览某些网站的时候,看到不错的网页可能就想把上面的内容给复制下来,但是有的网站就是为了防止别人复制,而在每段文字的结尾处增加了干扰码—
- 昨日一则关于Google今日要举办特别发布会的报道在业内大肆流传,据报道,Google要在今日下午举办的“Front E
- 北京时间10月24日消息,据国外媒体报道,上网本销售强劲及微软Office销售疲软累及其2010财年第一财季业绩。至少有一位分析师预计,即使
- 在传统SEO时代,关键词的选择意味着在搜索引擎中的排名先后,同时也在一定程度上反映了一个网站的品牌形象——如果一个知名公司的网站在搜索引擎中
- 在过去的半年里,百度一直同时运行两套竞价体系。百度商业运营副总裁沈浩瑜透露,“两套竞价体系在搜索推广平台上出价管理,对精
- 你的服务器上是否存有一些不能随意公开的重要数据呢?当然有吧?而最近,偏偏服务器遭受的风险又特别大,越来越多的病毒、心怀不轨的黑客,以及那些商
- 两权分立的FTP工作模式,工作环境: ADSL---(219.154.214.150)NAT(10.41.221.2)-----PC(10.
- 平时在使用虚拟机的时候都没有使用外网的需求,这次配置ceph的时候,快速安装ceph需要使用外网,突然发觉上不了网,经过网络上的学习,整理一
- Linux LVM逻辑卷配置过程详解许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估
- 什么是虚拟软件:虚拟软件是一个可以使你在一台机器上同时运行二个或更多Windows、LINUX等系统。它可以模拟一个标准PC环境。这个环境和
- 11月11日早间消息,腾讯官方宣布,今天正式启用QQ群等级功能。QQ群等级将采用金色皇冠和数字作为标识。腾讯正式推出QQ群等级功能据了解,Q
- 个人认为不管做什么网站一定要有特色,E文网站也是一样。先简单阐述下做网站的几个关键,也许大家听起来觉的很简单,但是大家可以认真想下你做到没。
- 内容为王,已越来越被业界所接受,并被视为SEO的典型范例。当然,为了捍卫这个头衔,网站内容必须与搜索引擎用户相关,便于搜索引擎的索引,具有导
- 最新消息,康盛创想(Comsenz)旗下核心产品UCenter Home(简称UCHome)当前应用站点已经超过15万家。UCenter H
- 12月11日消息,据国外媒体报道,据互联网安全和监视公司ScanSaf说,从11月末开始出现的一种新的和非常复杂的SQL注入攻击已经感染了1
- 很多朋友都用虚拟主机来做网站,将网页文件存放在虚拟空间上,但是页面内容一多,网站打开的速度就显得特别慢,如果您碰到这种情况,与其寻求更好的空
- 今天像往常一样打开站长统计的后台,关心一下各种访问统计,当我点击搜索引擎 ->今日统计 时突然弹出(alert)了
- 有些发布商可能收到过这样的通知邮件:“发布商不得更改 Google 广告的行为或定位,包括在 “浮动框脚本”中实施 AdSense 广告代码
- 步骤:终端运行sudo a2enmod程序提示可供激活的模块名称,输入:其中rewrite修改/etc/apache2/sites-enab
- 北京时间11月6日消息,据国外媒体报道,雅虎与玫琳凯周四向美国德克萨斯州达拉斯联邦法院提交联合文件称,双方之间的法律纠纷已经和解。玫琳凯此前