1

我继承了一些为进行自动化性能测试而编写的 shell 脚本,而没有任何 shell 脚本知识。我浏览了一些指南并使用了该语言,直到我可以完成我的项目。它大部分进展顺利,但我被困在我绝对无法在其他任何地方找到答案的事情上。

部分旧代码 ssh 进入测试中使用的服务器,并以脚本作为参数。我需要这个脚本在 Windows 和 Linux 上做不同的事情。到目前为止,我最好的解决方案是在 uname -a 的输出中对 Cygwin 进行 grep,如果找到,则执行 Windows 代码。

不幸的是,脚本在通过 ssh 传递时以及在 Windows 系统上通过 Cygwin 执行时都会失败。

#!/bin/bash
if [ `uname -a | grep "Cygwin"` ]; then
    echo "ARRGG WINDOWS!"
else
    echo "Some Linux command."
fi

产量:

./test.sh:第 2 行:[:参数太多

然后分支到非 Windows 逻辑。在我尝试过的任何 Linux 发行版上,同样的事情似乎运行良好。

我剩下三个问题。为什么我会遇到这个异常,除了谷歌搜索之外,还有什么好方法可以让我回答像这样的超特定问题(shell 脚本、Cygwin、ssh 和一个错误之间的交叉点),还有更好、更规范的方法吗?测试平台?

感谢您抽出宝贵时间,我很乐意提供任何有帮助的其他信息。

麻烦的条款被逐字复制,其余的都是为了SO。

4

2 回答 2

2

Cygwin 上的输出uname -a将是许多单词,包括Cygwin. 每个单词都将是test(aka [) 的一个参数。因此投诉。你可能想要:

case "$(uname -a)" in
(*Cygwin*) echo "Oh bother!";;
(*)        echo "Phew!";;
esac

或者:

if [ -n "$(uname -a | grep Cygwin)" ]
then echo "Oh bother!"
else echo "Phew!"
fi

或者:

if [ $(uname) = Cygwin ]
then echo "Oh bother!"
else echo "Phew!"
fi

这获得了 Cygwin 或 Linux——或者 Mac OS X 上的 Darwin,以及 AIX、Solaris、HP-UX 上的等效名称——并且避免了多参数问题,并且只运行一个命令而不是两个命令。

于 2013-04-18T23:00:57.687 回答
2

我试过你的命令,它在 bash 4.2.37 上执行没有错误。

它也可以在没有方括号或反引号的情况下工作 -if测试下一个命令的返回码......您可以使用该test命令,它也可以拼写[,但它也可以与返回码grep或什至:which总是正确的。

#!/bin/bash
if uname -a | grep Cygwin > /dev/null; then
     echo "ARRGG WINDOWS!"
else
     echo "Some Linux command."
fi

请注意, Linux 下$OSTYPE还有一个 bash 环境变量。linux-gnu

这里有一个深入的讨论:Detect the OS from a Bash script

于 2013-04-18T22:59:34.097 回答