Конструкция IF в поле Solaris для сравнения hh: mm: ss

Попробуйте сделать текущий идентификатор машины постоянным:

# mount --bind / /mnt
# cp /etc/machine-id /mnt/etc/machine-id
# reboot

Это должно избавить от монтирования tmpfs поверх / etc / machine-id .

1
08.02.2019, 19:43
5 ответов

<не является стандартным оператором дляtest/[..](см. цитату ниже ). Кажется, поддерживается Bash, Dash, busybox и другими, но, видимо, не Zsh (. Я не уверен насчет разных версий Ksh ). Bash, ksh и Zsh также будут поддерживать[[ str1 < str2 ]](без необходимости выхода из<). Вам нужно будет найти и использовать оболочку, которая поддерживает один из них.

(Обратите внимание, что Solaris 10 и более ранние версии даже имеют предварительный -POSIX /bin/sh, но здесь это не имеет значения, так как он в любом случае не является стандартным.)

Some additional primaries newly invented or from the KornShell appeared in an early proposal as part of the conditional command ([[]]): s1 > s2, s1 < s2,... They were not carried forward into the test utility when the conditional command was removed from the shell because they have not been included in the test utility built into historical implementations of the sh utility.

3
27.01.2020, 23:12

Для работы в Solaris внесено несколько изменений -sh; вот мой подход:

#!/bin/sh

lag=00:06:00
MAX_LAG=00:05:00

IFS=:
set -f

set -- $lag
lagtotal=`expr 3600 * $1 + 60 * $2 + $3`

set -- $MAX_LAG
maxlag=`expr 3600 * $1 + 60 * $2 + $3`

if [ "$lagtotal" -lt "$maxlag" ]
then
  echo "No LAG found."
else
  echo "LAG more than $MAX_LAG was found."
fi

(заметьте, что сравнение строго меньше -, чем немного расходится с вашей формулировкой «LAG больше , чем...")

1
27.01.2020, 23:12

В последних системах Solaris[1] /bin/shравно ksh93, поэтому следует выполнить следующее:

if [[ "$lag" < "$MAX_LAG" ]]; then..

Обратите внимание на двойные скобки [[.. ]]; при использовании внутри [[.. ]]оператор <будет выполнять лексикографическое сравнение в ksh, что должно выполняться дляHH:MM:SS-подобных строк.

Если ваша оболочка действительно не поддерживает это, вы можете использовать большие пушки:

trim(){ ifs=IFS; IFS=:; v=$1; set -- $2; eval "$v=$1$2$3"; IFS=$ifs; }
trim a "$lag"
trim b "$MAX_LAG"
if [ "$a" -lt "$b" ]; then..

[1] /bin/shдля Solaris — это ksh93, так как Solaris 11 .

1
27.01.2020, 23:12

Any suggestions what needs to be changed in Solaris box?

Вы можете исправить свой сценарий с очень незначительным изменением. Просто измените шебанг, т.е. замените:

#!/bin/sh

по:

#!/bin/bash

и все. Вы используете башизм, так что просто оставайтесь с bash, это оставляет меньше риска для других тонких несовместимостей, которые могут возникнуть в другой части скрипта; bashбыл доступен в стандартных установках на протяжении десятилетий в Solaris.

Вы используете Solaris 10, который является довольно старым (первый выпуск в 2005 году ), и с ним /bin/shдревняя оболочка (придерживается оригинального синтаксиса оболочки Bourne ), который по замыслу, чтобы не нарушать совместимость со старыми скриптами, не менялся с 1989 года (30 лет! ).

Текущая версия Solaris (Solaris 11 )использует оболочку POSIX как /bin/sh, но она все еще не bash, поэтому вам потребуется такое же исправление.

2
27.01.2020, 23:12

В наборе инструментов POSIX exprи awkможно использовать для сравнения строк.

Оба используют strcoll()для сравнения (так же, какsort:порядок сопоставления локали ), но вы можете установить локаль C, чтобы получить тип сравнения strcmp(). Для вещей вроде HH :MM :SS это все равно не имеет значения.

if expr "$time1" '<' "$time2" > /dev/null; then
  printf '%s\n' "$time1 was before $time2"
fi

Опять же, это не имеет значения для HH :MM :SS, но в общем случае обратите внимание, что exprбудет выполнять числовое сравнение, если операнды представляют собой десятичные целые числа, и сравнение строк в противном случае.. Это означает, что, например, 2будет считаться меньшим, чем 10, даже если strcmp()или strcoll()говорят об обратном.

Кроме того, exprзавершится ошибкой, если операнды являются exprоператорами:

$ x=+ y=-; expr "$x" '<' "$y"
expr: syntax error

Вы можете обойти обе проблемы, добавляя к операндам префиксы, которые не позволяют их воспринимать как числа или операторы:

expr "x $x" '<' "x $y"

Аналогичная проблема с awk. Вам понадобится:

awk 'BEGIN{exit(!(""ARGV[1] < ""ARGV[2]))}' "$x" "$y"

Чтобы убедиться, что сравнение является сравнением строк, а не сравнением чисел.

Вы можете использовать вспомогательные функции, такие как:

compare() {
  expr "x $1" "$2" "x $3"
}

или:

compare() {
  awk 'BEGIN{exit(!(""ARGV[1] '"$2"' ""ARGV[2]))}' "$1" "$3"
}

И использовать как:

if compare "$time1" '<' "$time2"; then
  printf '%s\n' "$time1 was before $time2"
fi

В любом случае, как всегда на Solaris, нужно убедиться, что /usr/xpg4/binстоит перед /binи /usr/binв $PATH, иначе вы получите устаревшие не -стандартные утилиты. В частности, /bin/awkв Solaris не будет работать с приведенным выше кодом. Это тот, что из 70-х без ARGV.

По той же причине вы не хотите использовать #!/bin/shв своей -чёлке. Стандарт/POSIX shв Solaris — /usr/xpg4/bin/sh(, хотя в Solaris 11 /bin/shизменен с оболочки Bourne на ksh93, что делает его намного более совместимым с POSIX; также обратите внимание, что /usr/xpg4/bin/shимеет много ошибок соответствия ).

1
27.01.2020, 23:12

Теги

Похожие вопросы