我正在使用运行 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 标准的脚本解释器。
进一步阅读
- 破折号
/bin/sh
。 Ubuntu 维基。 - 破折号
/bin/sh
.Debian 维基。 - “6.11 bash POSIX 模式“。 Bash 参考手册.GNU 项目。
- 巴什主义. Greg 的维基。
- Shell 命令语言. IEEE Std 1003.1。第 7 期。开放群组。
答案3
n
是一个变量,因此需要使用“$”引用它:
#!/bin/sh
read n
if (($n > 10)); then
echo "Number is pretty big"
else
echo "NUMBER IS WEAK AND SMALL"
fi