shell脚本中$符号的命令使用汇总

今天是远程办公的第4天,渐渐的找到了一点在家办公的节奏了,改了几个shell脚本,在改动过程中,发现还有一些知识点需要巩固,这里写出来,加深下印象。

关于$符号,大家肯定都不陌生,在shell脚本中,$的作用还是比较大多的,这里将所有的$组合都列出来,大家可以看下效果。

$组成的命令大概有下面几个:

$0,$1...$?,$!,$$,$*,$#,$@

下面分别看看这些意思是什么:

1.$0,$1

$0和$1比较好理解,他们的意思,分别是脚本名称和脚本的第一个参数,我们举个例子来看:

jwfyyzdembp:tmp jwfyyz$ cat test.sh
echo '$0的含义是':$0
echo '$1的含义是':$1
jwfyyzdembp:tmp jwfyyz$ ./test.sh yeyz
$0的含义是:./test.sh
$1的含义是:yeyz
jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz
$0的含义是:test.sh
$1的含义是:yeyz

需要注意一点,当使用./test.sh的方法来运行脚本的时候,$0的值是./test.sh,而不是test.sh

2.$?

$?指的是最后运行的命令的执行返回码,执行成功,则返回0,否则返回1,举例如下:

jwfyyzdembp:tmp jwfyyz$ cat test.sh
echo '$0的含义是':$0
echo '$1的含义是':$1
ls -l a.txt
echo '$?的结果是'$?
ls -l test.sh
echo '$?的结果是'$?

jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz
$0的含义是:test.sh
$1的含义是:yeyz
ls: a.txt: No such file or directory
$?的结果是1
-rwxr-xr-x 1 jwfyyz wheel 124 2 7 20:32 test.sh
$?的结果是0

可以看到,第一次运行ls -l a.txt的时候,由于我们的目录中没有a.txt这个文件,所以返回是1,第二次由于test.sh文件是存在的,所以返回的结果是0

3.$$

$$指的是脚本运行的当前进行id号,举例如下:

jwfyyzdembp:tmp jwfyyz$ cat test.sh
pwd
echo $$
sleep 10

jwfyyzdembp:tmp jwfyyz$ sh test.sh &
[1] 60658

jwfyyzdembp:tmp jwfyyz$ ps -ef|grep test
 501 60658 60529 0 8:36下午 ttys000 0:00.01 sh test.sh
 501 60661 60529 0 8:36下午 ttys000 0:00.00 grep test

我们在test.sh脚本后面设置了sleep 10的命令,脚本运行完会睡眠10s,脚本中打印出来了值60658,此时我们查看当前脚本的进程号,发现子进程的进程id是60658

4.$*和$@

这两个放在一起,主要是因为他们都代表引用的所有参数,单独打印出来结果,都是一样的,但是循环打印他们的内容,则会看出区别,举例如下:

jwfyyzdembp:tmp jwfyyz$ cat test.sh
echo '$*的结果是':$*
echo '$@的结果是':$@
echo "-- \$* 演示 ---"
for i in "$*"; do
 echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
 echo $i
done

jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz 1 2 3
$*的结果是:yeyz 1 2 3
$@的结果是:yeyz 1 2 3
-- $* 演示 ---
yeyz 1 2 3
-- $@ 演示 ---
yeyz
1
2
3

可以看到,循环打印的时候,$@

5.$#

$#容易理解,它的意思是参数的个数。举例:

jwfyyzdembp:tmp jwfyyz$ cat test.sh
echo '$*的结果是':$*
echo '$@的结果是':$@
echo '$#的结果是':$#

jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz 1 2 3
$*的结果是:yeyz 1 2 3
$@的结果是:yeyz 1 2 3
$#的结果是:4

6.$!

该命令是显示shell脚本中上一个后台执行命令的进程id号,如下:

jwfyyzdembp:tmp jwfyyz$ cat test.sh
echo '$*的结果是':$*
echo '$@的结果是':$@
echo '$#的结果是':$#
sleep 10 &
echo '$!的结果是':$!
sleep 10

jwfyyzdembp:tmp jwfyyz$ sh test.sh yeyz 1 2 3 &
[1] 61237
$*的结果是:yeyz 1 2 3
$@的结果是:yeyz 1 2 3
$#的结果是:4
$!的结果是:61238

jwfyyzdembp:tmp jwfyyz$ ps -ef|grep sleep
 501 61238 61237 0 9:12下午 ttys000 0:00.00 sleep 10
 501 61239 61237 0 9:12下午 ttys000 0:00.00 sleep 10
 501 61241 60529 0 9:12下午 ttys000 0:00.00 grep sleep

在test.sh中,我们使用了sleep 10这样的命令在后台执行,然后我们可以看到,$!返回的值是61238,当我们ps -ef命令去查询进程信息的时候,可以看到,61238这个进程对应的命令就是sleep 10,注意和$$区分开来,$$反应的是当前脚本执行的进程号,$!反应的是脚本中某个命令的进程号。

以上就是shell脚本中$符号的使用示例的详细内容,更多关于shell $的资料请关注我们其它相关文章!

(0)

相关推荐

  • 用来检测输入的选项$1是否在PATH中的shell脚本

    今天无意中发现一本挺有意思的shell编程的书,是e文的,内容是101个shell案例,坚持明天看一个,写点心得. 下面是例子001: #!/bin/sh # inpath - Verifies that a specified program is either valid as is, # or that it can be found in the PATH directory list. in_path() { # Given a command and the PATH, try to

  • PowerShell中的特殊变量$null介绍和创建多行注释小技巧

    本文介绍PowerShell中一个非常特殊的变量,那就是$null.$null的特殊之处在于,它永远不存储内容. 在翻看一本PowerShell的书时,发现了一段关于$null变量的描述,小编觉得非常有意思,特写下来跟大家分享. 看看这个例子: 复制代码 代码如下: PS C:\Users\zhanghong> $null=1122 PS C:\Users\zhanghong> $null PS C:\Users\zhanghong> 看懂没有?小编给$null变量赋了一个值"

  • Shell $0, $#, $*, $@, $?, $$和命令行参数的使用

    特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* 传递给脚本或函数的所有参数. $@ 传递给脚本或函数的所有参数.被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到. $? 上个命令的退出状态,或函数的返回值. $$ 当前Shell进程ID.对于 Shell 脚本,就是这些脚本所在的进程ID. 命令行参数 运行脚本时传递给脚本的参数

  • PowerShell默认参数$PSDefaultParameterValues结合Out-File输出到日志文件

    输出log是一个永恒的话题,什么tracelistener,net4log,nlog,windows中自带的eventlog,之前在自动重定向PowerShell控制台输出到文件 也算.其实借助于PowerShell 3.0以后的PowerShell默认参数$PSDefaultParameterValues,可以让Out-File,命令也变成也简易的Log神器. 复制代码 代码如下: $PSDefaultParameterValues['Out-File:FilePath'] = 'mylog.

  • Shell中的${}、##和%%使用范例

    今天看一个脚本文件的时候有一些地方不太懂,找了一篇文章看了一些,觉得不错,保留下来.   假设我们定义了一个变量为: 复制代码 代码如下: file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值: 复制代码 代码如下: ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt ${file#*.}:删掉第一个 . 

  • PowerShell中的$Input变量使用实例

    本文介绍在自定义PowerShell函数时,有一个$Input变量,这是一个系统自带的变量,它表示以块结构输入的管道数据. 先看看这个$Input变量在函数中是如何使用的. 复制代码 代码如下: function Test-Pipeline {     $pipelineData = @($Input)     $Count = $pipelineData.Count     "Received $Count elements: $pipelineData" } 运行结果如下: 复制代

  • 浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释

    摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 $* 所有参数列表.如"$*"用「"」括起来的情况.以"$1 $2 - $n&q

  • 详解Shell 脚本中 “$” 符号的多种用法

    通常情况下,在工作中用的最多的有如下几项: $0:Shell 的命令本身 1到9:表示 Shell 的第几个参数 $? :显示最后命令的执行情况 $#:传递到脚本的参数个数 $$:脚本运行的当前进程 ID 号 $*:以一个单字符串显示所有向脚本传递的参数 $!:后台运行的最后一个进程的 ID 号 $-:显示 Shell 使用的当前选项 ...... 今天将通过以上几种选项并做进一步的操作案例: 1.引用变量 引用变量时,使用 $ 符号直接来进行引用,以及包括循环变量: [root@localho

  • PowerShell函数中使用$PSBoundParameters获取输入参数列表实例

    本文介绍在自定义PowerShell函数时,有一个$PSBoundParameters的变量可以获取到输入参数列表.获取输入参入列表对我们进行功能调试有很大的帮助. 当我们在执行一个函数时,可以使用输入参数的值,但我在PowerShell中,参数有的是必选,有的是可选,那么我们怎么知道用户真实的输入了哪些参数呢? 在PowerShell函数中,有一个全局变量$PSBoundParameters,它是一个Hash表,里面保存了所有的输入参数和输入参数的值.通过输出这个变量,我们就可以看到所有的输入

  • 区分shell中的 反引号、$()和${}

    1.反引号与$()用于命令替换 反引号和$()的作用相同,用于命令替换(command substitution),即完成引用的命令的执行,将其结果替换出来,与变量替换差不多.比如: echo `date '--date=1 hour ago' +%Y-%m-%d-%H` #或者 echo $(date '--date=1 hour ago' +%Y-%m-%d-%H) 输出结果是相同的: 2019-02-02-09. 在编写Shell脚本时建议使用$(),原因主要有: (1)反引号与单引号外形

随机推荐