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,发现还有一些知识点需要巩固,这里写出来,加深下印象。

通常情况下,在工作中用的最多的有如下几项:

$ 符号说明
$0Shell 的命令本身
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

Shell脚本中$符号的几种用法小结

记忆方法如下:

  • # 是去掉左边(在键盘上 # 在 $ 之左边)

  • % 是去掉右边(在键盘上 % 在 $ 之右边)

  • 单一符号是最小匹配;两个符号是最大匹配

  • *是用来匹配不要的字符,也就是想要去掉的那部分

还有指定字符分隔号,与*配合,决定取哪部分

Shell脚本中$符号的几种用法小结

Shell脚本中$符号的几种用法小结

Shell脚本中$符号的几种用法小结

来源:https://juejin.cn/post/7000504587887050788

标签:Shell,$
0
投稿

猜你喜欢

  • VMware Workstation/Fusion 中安装 Fedora 23/24 及其他 Linux 系统时使用 Open VM Tools 代替 VMware Tools 增强工具的方法

    2022-01-14 23:11:28
  • 建Asaph微薄系统 整合WordPress博客

    2010-03-21 09:01:00
  • Google--PageRank(网页级别)技术解密

    2008-06-11 12:24:00
  • 如何去掉wordpress中的category

    2011-08-10 19:09:21
  • 应用:基于Unix的Web服务器安全指南

    2009-07-23 20:00:00
  • Windows 2000 安全检查清单-中级篇

    2009-12-02 18:49:00
  • 服务器数据备份寻找适合自己的最佳做法

    2009-09-20 20:17:00
  • 一句话式问答 网站优化常见问题整理(四)

    2009-01-19 16:24:00
  • 关于DEDECMS的URL优化的一些心得

    2010-04-24 20:39:00
  • 一次Docker中Redis连接暴增的问题排查实战记录

    2022-01-23 08:10:29
  • 怎样学好搜索引擎优化SEO?

    2009-02-24 08:51:00
  • 共享控制台--让远程桌面更人性化(2)

    2007-03-27 10:56:00
  • 从译言预测有道谷歌的云翻译

    2010-01-06 13:23:00
  • linux中mac地址绑定方法

    2022-01-18 19:24:21
  • 防止百度封你的站 你需要注意的六个方面

    2009-03-25 11:20:00
  • 笔/面试中常考到的一些linux脚本/管理命令

    2009-11-21 12:14:00
  • IXWebHosting优缺点点评及主机速度实测报告

    2010-08-05 09:50:00
  • 十分钟快速架设Linux系统下WebMail

    2010-03-12 18:47:00
  • 用xshell连接VMware中的Linux的方法步骤(2种)

    2021-03-05 17:25:05
  • 谷歌CEO:不会重复微软十年前犯下的错误

    2009-11-08 18:45:00
  • asp之家 网站运营 m.aspxhome.com