Solaris 框中的 IF 構造以比較 hh:mm:ss
我創建了下面的腳本,它在 hh:mm:ss 格式變數之間進行比較。
#!/bin/sh lag=00:00:00 MAX_LAG=00:05:00 echo $lag echo $MAX_LAG if [ "$lag" \< "$MAX_LAG" ] ##if [ "$lag" -lt "$MAX_LAG" ] ##if [ "$lag" -lt "$MAX_LAG" ] then echo "No LAG found." else echo "LAG more than $MAX_LAG was found." fi
在 linux box 中執行時,該腳本給了我正確的輸出
[test@sandboxtest02 ~]$ ./testhh.sh 00:00:00 00:05:00 No LAG found.
但是當我在 solaris 框中執行相同的腳本時,這個腳本給了我錯誤,
% sh test.sh 00:00:00 00:05:00 test.sh: test: unknown operator <
有什麼建議需要在 solaris 框中進行更改嗎?
<
不是test
/[..]
的標準運算符(請參閱下面的引用)。它似乎受到 Bash、Dash、busybox 和其他人的支持,但顯然不被 Zsh 支持(我不確定 Ksh 的不同版本)。Bash、ksh 和 Zsh 也將支持(無需轉義)。您必須找到並使用支持其中之一的外殼。[[ *str1* < *str2* ]]``<
(請注意,Solaris 10 和更早的版本甚至有一個 pre-POSIX
/bin/sh
,在這裡並不重要,因為它不是標準的。)一些新發明的或來自 KornShell 的額外初選作為條件命令的一部分出現在早期提案中($$ [ $$] ): s1 > s2, s1 < s2, … 當條件命令從 shell 中刪除時,它們沒有被帶到測試實用程序中,因為它們沒有包含在sh實用程序的歷史實現中內置的測試實用程序中.
有什麼建議需要在 Solaris 框中進行更改嗎?
您可以通過非常小的更改來修復您的腳本。只需修改shebang,即替換:
#!/bin/sh
經過:
#!/bin/bash
就是這樣。您正在使用 bashism,所以請留下來
bash
,這樣可以減少腳本其他部分中可能出現的其他細微不兼容的風險;bash
在 Solaris 下數十年來一直在標準安裝中可用。您正在執行相當舊的 Solaris 10(2005 年首次發布),並且它
/bin/sh
是一個古老的 shell(堅持原來的 Bourne shell 語法),從設計上講,它不會破壞與舊腳本的兼容性,自那以後就沒有改變1989 年(30 年!)。目前版本的 Solaris (Solaris 11) 使用 POSIX shell,
/bin/sh
但它仍然不是bash
,因此您需要相同的修復。