Bash sh runMyCode.sh“不以格式”为n在{10..99}中循环”

Bash sh runMyCode.sh“不以格式”为n在{10..99}中循环”,bash,shell,ubuntu,centos,Bash,Shell,Ubuntu,Centos,我对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的形

我对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的形式运行代码,它不会循环并激活单个元素,只打印激活ABC{10..99}DEF的代码。 对于这两种方法,脚本文件也可以作为-rwxr-xr-x执行

我不知道这是否正常,因为这两种方法在CentOS 5平台上非常有效。我知道./在Bash上运行,而在shell上运行,那么什么在CentOS上运行,什么在Ubuntu上不运行呢?我该怎么做才能使两个平台、两种方法的作用相同?

sh是Ubuntu上的dash,它不理解循环序列{10..99}。所以它循环一次,将整个{10..99}解释为一个字符串。我相信默认的sh是CentOS上的bash或ksh。所以它起作用了


如果您有合适的shebang,请始终使用./script.sh;如果您为特定shell编写了代码,请使用[bash | ksh | whatever]script.sh。使用不同于代码编写目的的解释器并不总是可行的。即使有时会这样做,这也是危险的,因为一个shell的构造可能不可用或具有相同的语义。

使用bash脚本运行它将在everywhere上产生相同的效果。@Jahid只是因为脚本在bash上运行在everywhere上。就像./script.sh一样,它在任何地方都可以工作,因为脚本以/bin/bash对吗?在过去,许多Linux发行版都将/bin/sh作为bash二进制文件/bin/bash的链接。但是一些系统正在远离这一点,在这些平台上/bin/sh是一个完全不同的shell dash、ash、pdksh或原始的Bourne shell,使用bash语法可能不会得到期望的结果。是的,没错/脚本将在任何地方都可以工作,只要您得到了提示,发布的代码将不会产生给定的输出。按原样,它将打印ABC,后跟可能为空的变量$nDEF的内容,而不是后跟DEF的变量$n的内容。改为使用'ABC${n}DEF。