shell脚本中的$*,$@和$#

本文详细介绍了Shell脚本中特殊变量$#, $*, $@的作用及区别,通过具体实例展示了如何处理传入脚本的不同类型的参数。
#!/bin/bash 
my_fun() { 
    echo "$#" 
} 
echo 'the number of parameter in "$@" is '$(my_fun "$@") 
echo 'the number of parameter in "$*" is '$(my_fun "$*")
执行:./my.sh p1 "p2 p3" p4后返回:
the number of parameter in "$@" is 3
the number of parameter in "$*" is 1

$*表示所有这些参数都被双引号引住。若一个脚本接收两个参数,$*等于$1$2
$@表示所有这些参数都分别被双引号引住,若一个脚本接收到两个参数,$@等价于$1$2
$#表示提供给脚本的参数号
这里怎么看出$*和$@的区别呢?为什么执行结果是3和1呢?这里$#又是什么意思呢?
-------------------------------------------------------------------------------------------------------
举例说:
脚本名称叫test.sh 入参三个: 1 2 3
运行test.sh 1 2 3后
$*为"1 2 3"(一起被引号包住)
$@为"1" "2" "3"(分别被包住)
$#为3(参数数量)
------------------------------------------------------------------------------------------------------
实例我们先写一个简单的脚本,执行以后再解释各个变量的意义
 
# touch variable
# vi variable
 
脚本内容如下:
 
#!/bin/sh
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:$@"
echo "show parm list:$*"
echo "show process id:$$"
echo "show precomm stat: $?"
保存退出
 
赋予脚本执行权限
 
# chmod +x variable
 
执行脚本
 
# ./variable aa bb (为什么在命令行使用./variable aa bb不行?只能使用sh variable.sh aa bb
number:2
scname:./variable
first:aa
second:bb
argume:aa bb
show parm list:aa bb
show process id:24544
show precomm stat:0
 
通过显示结果可以看到:
 
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

<think>我们正在讨论Shell脚本中的特殊变量。用户询问$?、$#$@$*、$$的含义。根据提供的引用,我们可以总结如下: 1. `$?`:上一条命令的退出状态。0表示成功,非0表示失败[^2]。 2. `$#`:传递给脚本的参数个数[^1][^2]。 3. `$@`:传递给脚本的所有参数的列表,每个参数作为独立的字符串[^1][^3]。 4. `$*`:传递给脚本的所有参数,但所有参数被视为一个字符串[^3]。 5. `$$`:当前Shell进程的进程ID(PID)[^2]。 注意:引用[3]提到`$n`(n为数字)表示第n个参数,其中`$0`是脚本名称。 接下来,我们需要按照用户要求的格式组织答案: - 使用中文回答。 - 行内数学表达式用`$...$`(但这里没有数学表达式,所以主要是变量名用`$`符号)。 - 独立公式用`$$...$$`(同样,这里可能不需要独立公式)。 - 在引用的地方添加引用标识(引用[1][2][3])。 - 生成相关问题。 回答结构: 1. 简述每个特殊变量的含义。 2. 可以给出一个综合示例(如引用[2]中的例子)。 3. 注意区分`$@``$*`的不同。 最后,生成相关问题。 </think>### Shell脚本中特殊变量含义简述 在Shell脚本中,`$?`、`$#`、`$@`、`$*`、`$$` 是预定义的特殊变量,用于获取脚本运行时的关键信息: 1. **`$$`** 当前Shell进程的**进程ID(PID)** ```bash echo "当前PID: $$" # 输出示例: 当前PID: 12345 ``` 常用于生成临时文件名或进程管理[^2]。 2. **`$?`** 上一条命令的**退出状态码** - `$ 0` 表示成功 - `$ \text{非零值}$` 表示失败(具体值表示错误类型) ```bash grep "test" file.txt echo "搜索状态: $?" # 0=找到, 1=未找到, 2=文件错误 ``` 3. **`$#`** 传递给脚本的**参数个数** ```bash ./script.sh arg1 arg2 echo "参数数量: $#" # 输出: 2 ``` 常用于校验参数数量是否匹配预期[^1][^2]。 4. **`$@` 与 `$*`** 二者均表示**所有参数列表**,但有区别: - `$@`:每个参数作为独立字符串(保留空格引号) ```bash for arg in "$@"; do echo "[$arg]"; done # 输入 ./script.sh "a b" c → 输出 [a b] [c] ``` - `$*`:所有参数合并为单个字符串 ```bash for arg in "$*"; do echo "[$arg]"; done # 输入 ./script.sh "a b" c → 输出 [a b c] ``` 当加双引号时(`"$@"` vs `"$*"`)差异最明显[^1][^3]。 --- #### 综合示例 ```bash #!/bin/bash echo "脚本名: $0" # 输出脚本名称 echo "进程ID: $$" # 输出当前PID echo "参数个数: $#" # 输出参数数量 echo "所有参数(@): $@" # 独立参数列表 echo "所有参数(*): $*" # 合并为单字符串 ls /nonexist >/dev/null 2>&1 echo "上条命令状态: $?" # 输出非0(失败) ``` 执行命令: `$ bash test.sh arg1 "arg two" arg3` 输出示例: ``` 脚本名: test.sh 进程ID: 33616 参数个数: 3 所有参数(@): arg1 arg two arg3 所有参数(*): arg1 arg two arg3 上条命令状态: 2 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值