我是 bash 脚本的新手,所以我遗漏了一些东西,但我什至无法想象遗漏了什么。之前的脚本在 CentOS 5
上运行良好但最近我切换到 Ubuntu 14.04 LTS
并且循环开始无法按预期工作。这是代码:
#!/bin/bash
for n in {10..99}
do
if ! ps aux | grep "ABC$n DEF " | grep -v grep
then
echo "Activating ABC$n DEF "
fi
done
如果我以
./runMyScript.sh
运行脚本正如预期的那样,它从 10 激活到 99:Activating ABC10 DEF
Activating ABC11 DEF
Activating ABC12 DEF
...
Activating ABC99 DEF
但是,如果我将代码运行为
sh runMyScript.sh
它不会循环,它会激活单个元素,打印 Activating ABC{10..99}DEF
只要。对于这两种方法,脚本文件也可以执行为
-rwxr-xr-x
.我不知道这是否正常,因为两种方法在平台
CentOS 5
上都像魅力一样起作用.我知道 ./
运行于 bash
和 sh
在 shell 上运行,但是什么在 CentOS 上有效,什么在 Ubuntu 上无效?我该怎么做才能使两个平台,两种方法都起作用?
最佳答案
sh
是 dash
在 Ubuntu 上,它不理解循环序列 {10..99}
.所以它在解释整个 {10..99}
时循环。作为一个字符串。我相信默认sh
在 CentOS 上是 bash 或 ksh。所以它有效。
始终使用 ./script.sh
如果你有适当的 shebang 或使用 [bash|ksh|whatever] script.sh
如果您有为特定 shell 编写的代码。使用与编写代码不同的解释器并不总是有效。即使有时这样做,它也是危险的,因为一个 shell 的构造可能不可用或具有相同的语义。
关于bash - "sh runMyCode.sh"不以 "for n in {10..99}"格式循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31305049/