Posts 用$*和$@读取全部参数的细节测试
Post
Cancel

用$*和$@读取全部参数的细节测试

写完用getopts处理全部的选项和参数</a>后,我注意到了获取所有参数的特殊变量$@,要不要加双引号,对参数的处理有很大影响。另外linux还是有个也是读取所有参数的特殊变量$*,引用他们时,加不加双引号变化很大。索性一并测试一下,总结一下它们的规律特点,分别是:

  • $*
  • "$*"
  • $@
  • "$@"

$*

  • 不加双引号:参数列表会被作为一个单词列表处理
  • 加双引号:参数列表会被作为一个整体字符串

$@

无论加不加双引号,行为都是一样。表现差异取决于参数列表本身有没有双引号。

  • 参数列表整体没有双引号:参数列表会被作为一个单词列表处理
  • 参数列表整体加了双引号:参数列表会被作为一个一个整体字符串

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
echo 'read parameters in $*'
for p in $*
do
  echo $p
done

echo

echo 'read parameters in "$*"'
for p in "$*"
do
  echo $p
done

echo

echo 'read parameters in $@'
for p in "$@"
do
  echo $p
done

echo

echo 'read parameters in "$@"'
for p in "$@"
do
  echo $p
done

测试结果

参数列表不加双引号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$allparas.sh a b c d e
read parameters in $*
a
b
c
d
e

read parameters in "$*"
a b c d e

read parameters in $@
a
b
c
d
e

read parameters in "$@"
a
b
c
d
e

参数列表加了双引号后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ allparas.sh "a b c d e"
read parameters in $*
a
b
c
d
e

read parameters in "$*"
a b c d e

read parameters in $@
a b c d e

read parameters in "$@"
a b c d e

在实际编写shell时,这两种变量和不同的引用方式,没有对错之分,选择适合自己的需求才是正确的。

This post is licensed under CC BY 4.0 by the author.

用getopts处理全部的选项和参数

使用Checksum对文件校验