bash脚本中$ 1和“$ 1”之间有什么区别?

what is the difference between $1 and “$1” in bash script?

本问题已经有最佳答案,请猛点这里访问。

例子

1
2
3
4
while [ -n"$1" ]
do
  something
done

我可以写$1而不是"$1"吗?两者的区别是什么user=alexanderuser="alexander"?谢谢


1
2
3
4
5
6
$ var="two words"
$ function num_args() { echo"${#}"; }
$ num_args $var
2
$ num_args"$var"
1

$A和"$A"之间的区别在于如何处理分词,以便将参数传递给程序和函数。

想象一下在文件上工作的脚本(比如移动它们):

1
$ cat my-move
1
2
3
4
5
6
7
8
9
#! /bin/sh
# my-move

src=${1}
dst=${2}

# ... do some fancy business logic here

mv ${src} ${dst}
1
$ my-move"some file" other/path

现在的代码(没有引号)显示,此脚本已损坏,因为它无法正确处理包含空格的文件路径。

(感谢@charlesduffy)

另外,在处理全局模式时引用事项:

1
2
3
4
5
$ var='*'
$ num_args"$var"
1
$ num_args $var
60

或:

1
2
3
4
5
6
$ shopt -s failglob
$ var='[name]-with-brackets'
$ echo $var
bash: no match: [name]-with-brackets
$ echo"$var"
[name]-with-brackets


引号可以用来对参数进行分组,而不管是否存在空格或其他特殊字符。通过演示,这里有一个案例,两个案例在本质上是不同的:

1
2
3
4
5
$ foo="bar baz"
$ sh -c 'echo $1' worker $foo
bar
$ sh -c 'echo $1' worker"$foo"
bar baz

在上面的例子中,我们传递没有引号的$foo,它传递bar作为参数1,baz作为参数2,但是当我们传递它时,它传递bar baz作为参数1。

因此,虽然您可以编写一个不带引号的变量(例如$1),但通常最好用引号将其括起来,除非您特别希望它可能被视为几个独立的参数。