"sh runMyCode.sh" 格式不循环 "for n in {10..99}"
"sh runMyCode.sh" not loops in format "for n in {10..99}"
我是 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
上的 ./
运行s 和 shell 上的 sh
运行s,但是在 CentOS 上有什么作用以及有什么作用不在 Ubuntu 上?我该怎么做才能让两个平台、两种方法都一样?
sh
是 Ubuntu 上的 dash
,它不理解循环序列 {10..99}
。所以它循环一次将整个 {10..99}
解释为一个字符串。我相信 CentOS 上的默认 sh
是 bash 或 ksh。所以它有效。
如果您有适当的 shebang,请始终使用 ./script.sh
,如果您有针对特定 shell 编写的代码,请始终使用 [bash|ksh|whatever] script.sh
。使用不同于编写代码的解释器并不总是有效。即使它偶尔出现,也是危险的,因为一个 shell 的构造可能不可用或具有相同的语义。
我是 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
上的 ./
运行s 和 shell 上的 sh
运行s,但是在 CentOS 上有什么作用以及有什么作用不在 Ubuntu 上?我该怎么做才能让两个平台、两种方法都一样?
sh
是 Ubuntu 上的 dash
,它不理解循环序列 {10..99}
。所以它循环一次将整个 {10..99}
解释为一个字符串。我相信 CentOS 上的默认 sh
是 bash 或 ksh。所以它有效。
如果您有适当的 shebang,请始终使用 ./script.sh
,如果您有针对特定 shell 编写的代码,请始终使用 [bash|ksh|whatever] script.sh
。使用不同于编写代码的解释器并不总是有效。即使它偶尔出现,也是危险的,因为一个 shell 的构造可能不可用或具有相同的语义。