[:关于Cygwin Shell脚本的参数太多了

时间:2013-04-18 22:50:04

标签: windows bash shell ssh cygwin

我继承了一些编写的shell脚本来进行自动化性能测试,而没有任何shell脚本知识。我浏览了几个指南并玩弄了这个语言,直到我可以完成我的项目。它大部分进展顺利,但我坚持一些我无法在其他任何地方找到答案的东西。

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

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

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

的产率:

./ test.sh:line 2:[:参数太多

然后分支到not-windows逻辑。在我试过的任何Linux发行版上,同样的东西似乎运行良好。

我有三个问题。为什么我会遇到这个异常,除了谷歌搜索之外,有什么方法让我能够获得像这样的超特定问题(shell脚本,Cygwin,ssh和一个错误之间的交集)的答案,并且有更好的,更规范的方式测试平台?

感谢您的时间,我很乐意提供有用的其他信息。

麻烦的条款是逐字复制的,其余部分是为SO而编写的。

2 个答案:

答案 0 :(得分:2)

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

它也可以在没有方括号或后退标记的情况下工作 - if测试下一个命令的返回代码...你可以使用test命令,它也可以拼写{ {1}},但它也可以使用[甚至grep的返回码,它始终为真。

:

注意,在Linux下还有一个bash环境变量#!/bin/bash if uname -a | grep Cygwin > /dev/null; then echo "ARRGG WINDOWS!" else echo "Some Linux command." fi ,它将是$OSTYPE

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

答案 1 :(得分:2)

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

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上的等效名称 - 并避免多个参数问题,只运行一个命令而不是两个命令。