特殊变量
- $#
表示传递给函数或脚本的所有参数的数量 - $* 和 $@
表示传递给函数或脚本的所有参数
当 $* 和 $@ 不被双引号" “包围时,它们之间没有任何区别,都是将接收到的参数看做一个字符串数组,彼此之间以空格来分隔;
当它们被双引号” "包含时,就会有区别了:
- "$*"将所有的参数当作一个字符串。
- "$@"将每个参数当作一个字符串。
源码(不带引号)
#!/bin/bash
echo $# $1 $2
for argv in $@
do
echo $argv
done
示例1(无空格)
$ ./test.sh abc def
2 abc def
abc
def
$
输入两个命令行参数 abc
def
,以空格符分隔。
示例2(带空格)
$ ./test.sh abc "d e f"
2 abc d e f
abc
d
e
f
$
输入两个命令行参数 abc
"d e f"
,以空格符分隔,第二个参数带空格但是用双引号包含。
"d e f"
用双引号包含依然被改变:$2
将多个空格压缩为一个空格;$@
按空格分割成多个参数。
源码(带引号)
#!/bin/bash
echo $# "$1" "$2"
for argv in "$*"
do
echo "argv"
done
for argv in "$@"
do
echo "$argv"
done
示例(带空格)
$ ./test.sh abc "d e f"
2 abc d e f
abc d e f
abc
d e f
$
$2
加双引号后保留了原始参数的多空格;$*
加双引号后所有的参数变成了一个字符串;$@
加双引号保留原始参数的数量和内容不变。
总结
"$num"
与$num
双引号保留原始参数内部空格;否则会将多空格压缩为一个空格。"$@"
与$@
双引号保留原始参数数量和内部空格;否则将参数内部空格解析为分隔符。"$*"
与$*
双引号将所有参数合并为一个参数,保留内部空格;否则将参数内部空格解析为分隔符。