我继承了一些编写的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而编写的。
答案 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上的等效名称 - 并避免多个参数问题,只运行一个命令而不是两个命令。