bash - "sh runMyCode.sh"不以 "for n in {10..99}"格式循环

标签 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 运行脚本正如预期的那样,它从 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 上都像魅力一样起作用.我知道 ./运行于 bashsh在 shell 上运行,但是什么在 CentOS 上有效,什么在 Ubuntu 上无效?我该怎么做才能使两个平台,两种方法都起作用?

最佳答案

shdash在 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/

相关文章:

python - 将 bash 脚本转换为 python 的问题

linux - 有没有在linux中打开图形终端的惯用方法?

shell - 远程创建用户名和设置密码

ubuntu - 在没有外星人的情况下将rpm转换为deb?

linux - 检查 bash 脚本上的 AWS cli 版本

linux - 从包含 ANSI 转义属性的 gitlab-runner 输出中解析标记值

linux - 带有单引号 bash 脚本的 jq

Bash 命令查看目录中是否有任何文件 - 测试目录是否为空

linux - 复制文件的shell脚本

ubuntu - 无法建立与 http ://controller:9696/v2. 0/networks 的连接