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

eps*_*lon 1 bash

例子

while [ -n "$1" ]
do
  something
done
Run Code Online (Sandbox Code Playgroud)

我可以写$1代替吗"$1"user=alexander和和有什么区别 user="alexander"?谢谢

Amo*_*son 7

$ var="two words"
$ function num_args() { echo "${#}"; }
$ num_args $var
2
$ num_args "$var"
1
Run Code Online (Sandbox Code Playgroud)

$A 和 "$A" 之间的区别在于将参数传递给程序和函数时如何处理断字。

想象一下适用于文件的脚本(假设移动它们):

$ cat my-move
Run Code Online (Sandbox Code Playgroud)
#! /bin/sh
# my-move

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

# ... do some fancy business logic here

mv ${src} ${dst}
Run Code Online (Sandbox Code Playgroud)
$ my-move "some file" other/path
Run Code Online (Sandbox Code Playgroud)

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

(以下感谢@CharlesDuffy)

另外在处理全局模式时引用问题:

$ var='*'
$ num_args "$var"
1
$ num_args $var
60
Run Code Online (Sandbox Code Playgroud)

或者:

$ shopt -s failglob
$ var='[name]-with-brackets'
$ echo $var
bash: no match: [name]-with-brackets
$ echo "$var"
[name]-with-brackets
Run Code Online (Sandbox Code Playgroud)