设置变量“值”和设置变量值之间的区别?

设置变量“值”和设置变量值之间的区别?

shell 脚本中的以下 2 个示例有什么区别:

set variable1             "value"

set variable2              value

答案1

在 shell 脚本中,value"value"'value'都是等效的。您可以选择使用或不使用引号。存在引号的原因是,有时,您想在字符串中放入具有特殊含义的字符,然后引号让 shell 知道该特殊字符是字符串的一部分。例如:

var=value more
var='value more'
var="value more"
var=value\ more

第一行将值value(5 个字符的字符串)分配给名为var;的变量。more是这个命令的一个单独的词,因为它前面有一个空格,空格的作用是该命令运行more环境变量var设置为 的程序value。其他三行都具有相同的含义:它们只是将变量设置var为值value more(10 个字符的字符串,其中第 6 个字符是字符串)。单引号'…'"…"包围一个字符串。引用的第三种可能性是反斜杠,它仅引用下一个字符。

单引号和双引号之间的区别在于,在单引号之间,每个字符代表其自身,但在双引号之间,仍然会解释一些字符。特别是,"\\"是包含单个反斜杠的字符串,因为字符串中的反斜杠被解释为引用下一个字符,同样"\""是仅包含双引号的字符串;"\$var"是一个以美元符号开头的 4 个字符的字符串,而"$var"是一个字符串,它是变量 的值var。相反,'$var'是一个以美元符号开头的 4 字符字符串,'\$var'是一个以反斜杠开头的 5 字符字符串。

引用还有更多微妙之处,我不会在这里详细讨论;阅读一本书或一本手册(例如bash手册)了解详细信息,也许还可以浏览在此网站上标记。

请注意,该set命令确实不是为变量赋值。set variable value不给变量赋值variable,语法是variable=value.该set命令的作用是替换脚本(或函数)的参数。当您运行带参数的脚本时,这些参数可在脚本中的特殊变量中使用,这些变量具有数字而不是名称:$1$2、 ...。这些变量称为位置参数(参数是因为它们是脚本/函数的参数,位置参数是因为它们是通过参数列表中的位置来访问的)。您不能使用数字 ( ) 分配给这些变量,但您可以通过使用参数1=foo运行来设置所有位置参数。set例如:

#!/bin/sh
echo "$1"
set hello world
echo "$1"

该脚本打印在其命令行上传递的第一个参数,然后打印hello.内置set还有其他工作,请参阅手动的更多细节。

set对于基本的 shell 编程,您现在可以忘记这个用法。引用的基础知识很重要。您需要知道的一件事是始终在变量扩展周围使用双引号,即"$foo"而不是 plain $foo,因为简单地$foo破坏了价值

我在这个答案中写的所有内容都是关于 Bourne/POSIX 风格的 shell:shdashbashkshzsh 等。还有其他不太常见的 shell 系列,具有不同的语法。在(t)csh中,set涉及到一些赋值,但仍然涉及等号;引用 with\'"有点相似但不完全相同。在fish中,set variable value确实将变量设置variable为值value;引用 with 也\'"有些相似但不完全相同。

相关内容