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



以下示例中的引号是必要的还是多余的。为什么呢?

#!/bin/bash
arg1="$1"
arg2="$2"

你如何解释$1123 echo abc的事实,第一个赋值不被解释为:

arg1=123 echo abc

这是一个普通的命令(echo(调用,参数abc和一个传递给执行的环境变量(arg(。

来自 POSIX shell 语法规范的第 2.9.1 节:

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

字符串拆分和通配(双引号抑制的步骤(不在此列表中。

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


(请注意,关于如何解析命令的决定 - 因此,无论是赋值,简单命令,复合命令还是其他东西 - 在参数扩展之前发生;因此,在考虑$1的值之前var=$1被确定为赋值!如果这是不正确的,以至于数据可以默默地成为语法,那么在bash中编写处理不受信任数据的安全代码将更加困难 - 如果不是不可能的话(。