Почему когда x=abc, [[ $x > 123 ]] && echo yes || echo no возвращает yes? [duplicate]

Поддержка GNU или Solaris 11 sleep аргументов (одна или несколько [smhd] длительностей, поэтому также будет работать с традиционными реализациями, поддерживающими только одно десятичное целое число (например, на FreeBSD), но не с теми, кто принимает более сложные аргументы, такие как длительность ISO-8601 ). Использование etime вместо etimes , поскольку это более переносимо (стандартный Unix).

remaining_sleep_time() { # arg: pid
  ps -o etime= -o args= -p "$1" | perl -MPOSIX -lane '
    %map = qw(d 86400 h 3600 m 60 s 1);
    $F[0] =~ /(\d+-)?(\d+:)?(\d+):(\d+)/;
    $t = -($4+60*($3+60*($2+24*$1)));
    for (@F[2..$#F]) {
      s/\?//g;
      ($n, $p) = strtod($_);
      $n *= $map{substr($_, -$p)} if $p;
      $t += $n
    }
    print $t'
}

( s / \? // g должен избавиться от символов ? , которые procps ' ps использует как замена управляющих символов. Без нее не удалось бы проанализировать sleep $ '\ r1d' или sleep $ '\ t1d' ... К сожалению, в некоторых регионах, включая Локаль C , он использует . вместо ? . В этом случае мы мало что можем сделать, так как невозможно определить \ t5d из .5d (полдня)).

Передайте идентификатор идентификатора в качестве аргумента.

Это также предполагает, что argv [0] , переданный в sleep , не содержит пробелов и что количество аргументов достаточно мало, чтобы оно не усекалось ps .

Примеры:

$ sleep infinity & remaining_sleep_time "$!"
Inf
$ sleep 0xffp-6d &
$ remaining_sleep_time "$!"
344249
$ sleep 1m 1m 1m 1m 1m & remaining_sleep_time "$!"
300

Для вывода [[[ddd-] HH:] MM:] SS вместо количества секунд замените print $ t на :

$output = "";
for ([60,"%02d\n"],[60,"%02d:"],[24,"%02d:"],[inf,"%d-"]) {
  last unless $t;
  $output = sprintf($_->[1], $t % $_->[0]) . $output;
  $t = int($t / $_->[0])
}
printf "%s", $output;

2
11.02.2017, 23:54
1 ответ

Это потому, что внутри [[…]] операторы <и> выполняют сравнение строк.

При сравнении строк порядок задается (в основном) алфавитом, где a перед (меньше), чем b, и меньше, чем c: a .
Числа обычно перед (меньше) букв: 1 <2

Итак, как сортируется после 1 abc больше, чем 123 :

$ [[ abc > 123 ]] && echo yes
yes

Или, как вы это представляете:

$ x=abc    y=123
$ [[ $x > $y ]] && echo yes
yes
7
27.01.2020, 21:52

Теги

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