Ubuntu 上 Bash 4.2.45 的问题

Ubuntu 上 Bash 4.2.45 的问题

我正在使用运行 Ubuntu 13.10 的远程服务器,其中安装了 Bash 4.2.45。我的家庭系统是 OS X Mavericks,其中安装了 Bash 3.2.51(Darwin 版本)。我过去很少使用 bash,但我一直在编写一个相当大的脚本,并注意到远程服务器上安装的版本有些奇怪。

以一个简单的脚本为例:

#!/bin/sh

read n

if ((n > 10)); then
        echo "Number is pretty big"
else
        echo "NUMBER IS WEAK AND SMALL"
fi

虽然在 bash 3.2.51 下它可以识别该表达式并且可以在 Ubuntu 上的 bash 4 下运行,但它会抛出一个奇怪的错误:

script.sh: 5: script.sh: n: not found

但不仅无法识别 (( . . . )),有时变量和其他逻辑语句也无法识别。作为一名 bash 初学者,这非常令人困惑,我想问问我能做些什么。我可以更改语法规则吗?或者只是将远程服务器降级到 3.xy 版本?任何帮助都值得感激。

答案1

当我阅读您的查询时,我对您的行为感到惊讶,因此我决定快速重现它,因此我设置了一个新的 Ubuntu 13.10 VM,其中包含 Bash 版本 4.2.45。

完成后,我就能重现您描述的行为。

经过进一步调查,似乎你只需要更换#!/bin/sh经过#!/bin/bash使其发挥作用。

编辑 :

启动脚本:

  • bash script.sh./script.sh将工作。
  • sh script.sh不管用。

假设你有#!/bin/bash在第一行

希望它对你有用!

答案2

您根本没有使用 Bourne Again Shell。

认为它/bin/sh不仅仅是一个符合 POSIX 标准的 shell 是错误的。(即使它bash,当 bash 被调用时,sh它会巧妙地改变其行为。)在 Ubuntu 上,/bin/sh现在默认为 Debian Almquist Shell,这是一个不同的外壳— 在 Unix 和 Linux 系统上可以找到的众多 shell 之一(Thompson、Bourne、Bourne Again、Almquist、Korn、Z、Friendly Interactive、C、Tenex C、BusyBox、Policy-compatible Ordinary 等)。/bin/sh从 Bourne Again 切换到 Debian Almquist 提高了 Debian 和 Ubuntu 系统的启动速度,它们执行很多作为引导过程的一部分的 shell 脚本。

如果你真的想利用巴什主义就像((...))在您的脚本中,然后/bin/bash在其行中明确设置为脚本解释器#!

相反,如果您想/bin/sh在 Mac OS 和 Linux 等不同的系统上指定脚本解释器,那么请严格遵守符合 POSIX 标准的脚本解释器。

进一步阅读

答案3

n是一个变量,因此需要使用“$”引用它:

#!/bin/sh

read n

if (($n > 10)); then
        echo "Number is pretty big"
else
        echo "NUMBER IS WEAK AND SMALL"
fi

相关内容