gpt4 book ai didi

bash - bash脚本会预先解析语法吗?

转载 作者:行者123 更新时间:2023-11-29 09:45:50 24 4
gpt4 key购买 nike

我正在运行 bash 脚本,该脚本需要为 SunOs 和 Linux 运行不同的代码,并且我从不应该是真的代码部分得到语法错误。我没想到,因为我认为 Bash 是作为解释器工作的。

bash 版本在 SunOS 上是 2.5,在 Linux 上是 4.1。它提示的语法只支持 3.1 版本。

我试图禁用带有“else”子句的较新代码,但它看起来仍处于预解析状态。

我的脚本的第一行也有“:”而不是“#!/bin/sh”。

测试.sh:

:
echo "`uname`"
if [ `uname` = "SunOS" ]
then
echo "do old stuff"
else
echo "new stuff"
arr=($(grep "^X1" ../foo.txt | sed 's/.*=//'))
fi

错误是

> ./test.sh
SunOS
./test.sh: syntax error at line 8: `arr=' unexpected

如果我注释错误行,那么它会正常工作:

:
echo "`uname`"
if [ `uname` = "SunOS" ]
then
echo "do old stuff"
else
echo "new stuff"
#arr=($(grep "^X1" ../foo.txt | sed 's/.*=//'))
fi

结果是

> ./test.sh
SunOS
do old stuff

我的问题是如何在不评论的情况下修复此语法错误?我必须有“if/else”才能在不同的机器上运行这个脚本。

最佳答案

至少从版本 2 开始,bash 就支持数组语法;如果你在那里遇到错误,那是因为你的脚本根本不是在 bash 下运行,而是在其他一些 shell 下运行。这可能与您的脚本以 : 开头而不是 shebang 行有很大关系,这意味着它取决于运行脚本的任何人来确定运行它的内容,结果不一致。我强烈建议使用合适的 shebang 系列。如果 bash 不存在于可预测的位置,您可以使用 #!/usr/bin/env bash。如果 bash 可能不在 PATH 中,您可以使用类似于脚本序言 here 的东西-- #!/bin/sh shebang 后跟用于查找和切换到 bash 的命令。

关于预解析的问题:是的,bash 和其他 shell 在执行 if 结构之前会一直解析到 fi 关键字。他们需要找到 thenelsefi 关键字,以便弄清楚他们将要执行什么以及他们要执行什么将跳过,为了找到他们必须解析他们的方式。

关于bash - bash脚本会预先解析语法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48389848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com