[英][: too many arguments on Cygwin Shell script
我繼承了一些編寫的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:第2行:[:參數太多了
然后分支到not-windows邏輯。 在我試過的任何Linux發行版上,同樣的東西似乎運行正常。
我有三個問題。 為什么我會遇到這個異常,除了谷歌搜索之外,有什么方法讓我能夠獲得像這樣的超特定問題(shell腳本,Cygwin,ssh和一個錯誤之間的交集)的答案,並且有更好的,更規范的方式測試平台?
感謝您的時間,我很樂意提供任何有用的信息。
麻煩的條款是逐字復制的,剩下的就是SO。
我嘗試了你的命令,它在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下是linux-gnu
。
這里有一個深入的討論: 從Bash腳本中檢測操作系統
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上的等效名稱 - 並避免多參數問題,只運行一個命令而不是兩個命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.