“$ var”和$ {var}之间有什么区别?

时间:2013-12-20 09:31:43

标签: bash

bash中扩展变量时,我通常使用${var},但我经常也会看到"$var".我所说的变量是用于在脚本中将参数传递给bash函数。我不需要它们或者一定要它们使用通配或其他花哨的东西。它仅用于传递字符串。那么哪种扩展更适合这种情况呢?

3 个答案:

答案 0 :(得分:4)

这不是选择其中一个问题,在某些情况下需要大括号时,引号总是值得推荐。

引号保留格式,而大括号用于执行variable expansion和一些边缘情况:

引用的重要性

如果我们不引用变量调用,则格式将丢失。

$ myvar="hello
how are you"
$ echo $myvar
hello how are you
$ echo "$myvar"
hello
how are you

另外,假设您将文件名存储在变量中。如果文件名恰好有空格,除非引用它,否则无法正确使用文件名。

$ echo "hello" > "my file"
$ ls -ltr
-rw-r--r-- 1 me me    0 Dec 20 10:41 my file

$ file="my file"
$ cat $file
cat: my: No such file or directory
cat: file: No such file or directory

$ cat "$file"
hello

大括号的重要性

如果我们不使用花括号,我们就不能使用变量,而是在调用变量后不添加空格的值。

$ myvar="hello"
$ echo ${myvar}1
hello1
$ echo $myvar1

$

答案 1 :(得分:3)

$ {var}是更好的选择,因为您可以清楚地看到变量的名称。

例如:

var = "hello"
echo ${var}_1
hello_1
echo $var_1

echo $var_1没有显示任何内容,因为bash认为您尝试访问变量var_1

答案 2 :(得分:3)

这些是彼此正交的,你需要理解两者:

这是Bash中的一个重要主题,它可以为微妙的错误带来无限的机会,所以这里的任何解释都不会完整。考虑到这一点:

  • ${var}而不是$var将变量$var与周围的代码分开。例如:

    $ var=foo
    $ echo $variable
    

    这不打印任何内容(除非定义变量variable)。

    $ echo ${var}iable
    fooiable
    
  • “$ var”确保变量内容不会发生分词:

    $ var='foo    bar'
    $ echo $var
    foo bar
    $ echo "$var"
    foo    bar
    

同样,这只是表面上的问题。如果你想编写可靠的Bash脚本,链接的文章(以及几乎所有的wiki)都是很好的学习场所。