在基于命令行参数变量扩展声明局部变量时,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。