当前位置:  开发笔记 > 编程语言 > 正文

Bash - 为什么$ VAR1 = FOO或'VAR = FOO'(带引号)返回命令未找到?

如何解决《Bash-为什么$VAR1=FOO或'VAR=FOO'(带引号)返回命令未找到?》经验,为你挑选了1个好方法。

对于下面两个例子中的每一个,我将尝试解释我期望的结果和我得到的结果.我希望你帮我理解为什么我错了.

1)

VAR1=VAR2 $VAR1=FOO

结果: -bash: VAR2=FOO: command not found

在第二行中,$VAR1扩展为VAR2,但为什么Bash将结果解释VAR2=FOO为命令名而不是变量赋值?

2) 'VAR=FOO'

结果: -bash: VAR=FOO: command not found

为什么引号使Bash将变量赋值视为命令名?

你能否一步一步地描述Bash如何处理我的两个例子?



1> Charles Duff..:

在此知识库中的其他问答条目中,如何最好地间接分配变量.在这些:

bash中的间接变量赋值

将函数输出保存到参数中指定的变量中

如果这是您实际打算提出的问题,那么这个问题应该作为副本关闭.我将做出相反的假设,并专注于字面问题 - 为什么你的其他方法失败 - 下面.


POSIX sh语言指定什么作为有效赋值?为什么$var1=foo'var=foo'失败?

背景:关于POSIX sh规范

该POSIX shell命令语言规范是非常具体什么构成的分配,如引用如下:


4.21变量分配

在shell命令语言中,由以下部分组成的单词:

varname=value

当在定义了赋值的上下文中使用时,并且在任何时候都不应该将(表示单词或字段)指定为varname表示的变量的值.

VARNAME价值的部分,应当符合一个名字和一个词的要求,分别,只是它们被嵌入的不带引号的等号和分隔,除了其他的分隔符.

此外,从第2.9.1节开始,简单命令,重点是:

    根据Shell语法规则识别为变量赋值或重定向的单词将保存,以便在步骤3和4中进行处理.

    应扩展不是变量赋值或重定向的词.如果任何字段在扩展后仍然存在,则第一个字段应被视为命令名称,其余字段是该命令的参数.

    重定向应按重定向中的描述执行.

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

另外,从语法:

如果'='之前的所有字符形成有效名称(参见IEEE Std 1003.1-2001的基本定义卷,第3.230节,名称),则应返回令牌ASSIGNMENT_WORD.(引用的字符不能参与形成有效名称.)


请注意:

在任何扩展(或引用删除!)发生之前,必须在解析序列的最开始将该命令识别为赋值.

名称必须是有效名称.文字引号不是有效变量名称的一部分.

等号必须不加引号.在第二个示例中,引用了整个字符串.

波形扩展,参数扩展,命令替换等之前识别分配.


为什么$var1=foo不能充当任务

如语法中所给出的,赋值中的所有字符=必须是变量名中的有效字符才能被识别.$不是名称中的有效字符.由于在简单命令处理的步骤1中识别分配,因此在进行扩展之前,文本文本$var1(而不是该变量的值)用于此匹配.

为什么'var=foo'不能充当任务

首先,所有字符=必须在变量名中有效,并且在变量名中'无效.

其次,只有在=未引用的情况下才会识别分配.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有