以下示例中的引号是必要的还是多余的。为什么呢?
#!/bin/bash
arg1="$1"
arg2="$2"
你如何解释$1
123 echo abc
的事实,第一个赋值不被解释为:
arg1=123 echo abc
这是一个普通的命令(echo
(调用,参数abc
和一个传递给执行的环境变量(arg
(。
来自 POSIX shell 语法规范的第 2.9.1 节:
在分配值之前,应扩展每个变量分配以进行波浪号扩展、参数扩展、命令替换、算术扩展和引号删除。
字符串拆分和通配(双引号抑制的步骤(不在此列表中。
因此,引号是多余的 - 不仅对于右侧和侧面引用位置参数的赋值,而且对于所有赋值,除非(1(需要单引号而不是双引号字符串的行为;或(2(值中的空格或其他内容将被解析为语法而不是文字。
(请注意,关于如何解析命令的决定 - 因此,无论是赋值,简单命令,复合命令还是其他东西 - 在参数扩展之前发生;因此,在考虑$1
的值之前,var=$1
被确定为赋值!如果这是不正确的,以至于数据可以默默地成为语法,那么在bash中编写处理不受信任数据的安全代码将更加困难 - 如果不是不可能的话(。