Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在基于命令行参数变量扩展声明局部变量时,bash中是否需要引号?_Bash_Variables_Syntax_Command Line Arguments_Quoting - Fatal编程技术网

在基于命令行参数变量扩展声明局部变量时,bash中是否需要引号?

在基于命令行参数变量扩展声明局部变量时,bash中是否需要引号?,bash,variables,syntax,command-line-arguments,quoting,Bash,Variables,Syntax,Command Line Arguments,Quoting,下面例子中的引用是必要的还是多余的。为什么 #!/bin/bash arg1="$1" arg2="$2" 当$1是123 echo abc时,您如何解释这一事实,第一个赋值不被解释为: arg1=123 echo abc 这是一个普通的命令(echo)调用,带有参数abc,以及一个传递给执行的环境变量(arg)。来自POSIX外壳语法规范: 在赋值之前,应展开每个变量赋值,以进行波浪线展开、参数展开、命令替换、算术展开和引号删除 字符串拆分和全局化(双引号禁止的步骤)不在此列表中 因此,

下面例子中的引用是必要的还是多余的。为什么

#!/bin/bash

arg1="$1"
arg2="$2"
$1
123 echo abc
时,您如何解释这一事实,第一个赋值不被解释为:

arg1=123 echo abc
这是一个普通的命令(
echo
)调用,带有参数
abc
,以及一个传递给执行的环境变量(
arg
)。

来自POSIX外壳语法规范:

在赋值之前,应展开每个变量赋值,以进行波浪线展开、参数展开、命令替换、算术展开和引号删除

字符串拆分和全局化(双引号禁止的步骤)不在此列表中

因此,引号是多余的——不仅对于右侧和侧边引用位置参数的赋值,而且对于所有赋值(1)需要单引号而不是双引号字符串行为的赋值除外;或者(2)值中的空格或其他内容将被解析为语法而不是文字



(请注意,关于如何解析命令的决定——因此,它是赋值、简单命令、复合命令还是其他命令——发生在参数扩展之前;因此,
var=$1
被确定为在考虑
$1
的值之前的赋值!这是不真实的,以至于数据可能会静音吗在语法上,如果不是不可能的话,在bash中编写处理不受信任数据的安全代码要困难得多)发生在变量扩展之前;这也是为什么不能设置
var='if'
然后运行
$var foo;然后运行bar;fi
,因为关键字(如赋值!)只有在参数扩展发生之前才被识别。U&L堆栈交换上的相关帖子:。在这种情况下,引用是多余的,但在所有其他情况下,引用是如此重要,我觉得应该引用分配来强化习惯。作为最佳实践,我同意。我应该如何正确阅读此内容?
$1
是expanded(派遣前),这会生成空格,然后bash应该像我描述的那样工作:执行
echo
$1
和正常变量
$var
的处理方式有什么区别吗?我们是否也可以说,对于所有单变量扩展分配,引号总是多余的?@GabrielPetrovay,是的,引号是多余的一般来说,赋值是多余的,除非存在语法空白,否则会将它们作为一种完全不同的命令进行分析。例如,对于
arg3=${foo}${bar}
,赋值也是多余的。@tripleee,…done;由于已接受状态,无法从此处删除,但已标记此副本社区wiki。