为什么bash在这个脚本中将git checkout参数误认为是命令?

为什么bash在这个脚本中将git checkout参数误认为是命令?,bash,git,Bash,Git,我编写这个bash脚本是为了安装Saleor 当脚本到达第605行时,它抛出一个错误: Deploy\u Saleor/Deploy.sh:第605行:[:缺少“]” Deploy_Saleor/Deploy.sh:第605行:“2.11.1”:未找到命令 下面是第605行的bash脚本: 如果[“vOPT”=“true”| |$VERSION!=”];然后 #签出指定的版本 sudo-u$UN-git签出$VERSION 等待 fi 如果这有帮助的话,整个项目就是 我用单引号尝试了这个脚

我编写这个bash脚本是为了安装Saleor

当脚本到达第605行时,它抛出一个错误:

Deploy\u Saleor/Deploy.sh:第605行:[:缺少“]”
Deploy_Saleor/Deploy.sh:第605行:“2.11.1”:未找到命令
下面是第605行的bash脚本:


如果[“vOPT”=“true”| |$VERSION!=”];然后
#签出指定的版本
sudo-u$UN-git签出$VERSION
等待
fi
如果这有帮助的话,整个项目就是

我用单引号尝试了这个脚本,没有单引号,并用反勾号作为错误提示,但是无论签出
版本
的内容如何,错误都会持续存在

如果直接在命令行中键入
git checkout 2.11.1
,则版本签出按预期工作:

user@host:~/saleor$ git checkout 2.11.1
Note: switching to '2.11.1'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 3848810d0 Bump to 2.11.1


您误用了
|
运算符。这是一个特殊的shell表达式,用于将命令链接在一起(如果第一个命令失败,则执行第二个命令)。它不是一个布尔“或”。您想要:

if [ "vOPT" = "true" -o "$VERSION" != "" ]; then
或:

在第一个示例中,
-o
是一个布尔“or”。有关更多信息,请参见帮助测试

在第二个例子中,我们有
if | |;然后
。如果第一个命令失败,shell将执行第二个命令,管道的结果是第二个命令的退出代码

请注意,我在这里引用了
$VERSION
作为
“$VERSION”
,如果
$VERSION
为空,这将防止出现不同的错误:

$ [ "vOPT" = "true" -o $VERSION != "" ]
-bash: [: too many arguments
$ [ "vOPT" = "true" ] || [ $VERSION != "" ]
-bash: [: !=: unary operator expected

如果您在该部分代码之前设置-x,跟踪输出是什么样子的?
Deploy\u Saleor/Deploy.sh:line 606:[:missing
]+'''''2.11.1'\''!=''''']
Deploy\u Saleor/Deploy.sh:line 606:'2.11.1':找不到命令'这到底意味着什么?它似乎在试图说明,如果您更新了答案以包含这些信息,可能效果会更好,因为注释不允许正确的代码格式。@larsks,完成。我一点也不理解这个输出。在我看来,它像是正则表达式。在$VERSION中,看起来比你们想象的要多得多。如何填充版本?不,相同的错误。虽然您的观察有助于比较,但它根本不会改变错误状态。我怀疑您忘记了引用我在这里建议的
“$VERSION”
。我忽略了括号。这是正确的解决方案。非常感谢你!请注意,在bash(但不是所有其他shell)中,可以使用
[[]]
(“条件表达式”)而不是
[]
(这相当于
test
命令)。语法非常相似,但在
[[]]
表达式中,可以使用
| |
&&
作为逻辑运算符。看见
if [ "vOPT" = "true" ] || [ "$VERSION" != "" ]; then
$ [ "vOPT" = "true" -o $VERSION != "" ]
-bash: [: too many arguments
$ [ "vOPT" = "true" ] || [ $VERSION != "" ]
-bash: [: !=: unary operator expected