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

我inheritance了一些编写的shell脚本来执行自动化性能testing,而没有任何shell脚本知识。 我通过一些指南浏览,并使用语言,直到我可以做我的项目。 它大部分进展顺利,但我坚持的东西,我绝对没有能够find任何其他地方的答案。

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

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

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

收益率:

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

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

我剩下三个问题。 为什么我得到这个exception,除Googlesearch之外,有什么方法可以让我得到像这样的特定问题(shell脚本,Cygwin,ssh和一个错误的交集)的答案,还有更好,更规范的方法吗?testing平台?

感谢您的时间,我很乐意提供任何其他信息,这将有所帮助。

这个麻烦的条款被逐字复制了,其余的都是由SO编写的。

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 

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

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

它也将工作没有方括号或反标记 – if测试下一个命令的返回代码…您可以使用test命令,也可以拼写[ ,但它也将与返回代码grep甚至是:总是如此。

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

请注意,还有一个bash环境变量$OSTYPE ,它将在linux-gnu下是linux-gnu

这里有一个深入的讨论: 从Bash脚本中检测操作系统