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:sh
、dash
、bash
、ksh
zsh 等。还有其他不太常见的 shell 系列,具有不同的语法。在(t)csh中,set
涉及到一些赋值,但仍然涉及等号;引用 with\'"
有点相似但不完全相同。在fish中,set variable value
确实将变量设置variable
为值value
;引用 with 也\'"
有些相似但不完全相同。