Shell-Script

Solaris 框中的 IF 構造以比較 hh:mm:ss

  • February 14, 2019

我創建了下面的腳本,它在 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,因此您需要相同的修復。

引用自:https://unix.stackexchange.com/questions/499495