LINUX.ORG.RU
ФорумAdmin

Выбор наименьшего значения

 


0

3

Привет! Подскажите как правильно на bash выбрать наименьшее число, а потом его подставить в команду?

Допустим есть переменные i1=1, i2=0, i3=7 с разными числами, нужно выбрать наименьшее, а потом с этой переменной выполнить операцию.

Заранее спасибо.


bae@localhost:~$ a=10
bae@localhost:~$ b=20
bae@localhost:~$ c=30
bae@localhost:~$ d=5

echo $a $b $c $d | awk '{if(min==""){min=max=$1}; if($1>max) {max=$1}; if($1< min) {min=$1}; count+=1} END {print min}'
pyatak123
()

Для пары значений:

function min() {
    if (( "$1" < "$2" )); then echo "$1";
    else echo "$2";
    fi
}

i1=1
i2=0
i3=7
min=$(min $i1 $(min $i2 $i3))

Для нескольких значений:

function min() {
    local min="$1"
    shift
    for arg; do
        if (( arg < min )); then
            min="$arg";
        fi
    done
    echo "$min"
}

i1=1
i2=0
i3=7
min=$(min $i1 $i2 $i3)

Если нужно получить именно имя переменной с наименьшим значением:

function min_indirect() {
    local min="$1"
    shift
    for arg; do
        if (( "${!arg}" < "${!min}" )); then
            min="$arg";
        fi
    done
    echo "$min"
}

i1=1
i2=0
i3=7
min_name=$(min i1 i2 i3)
min=${!min_name}

intelfx ★★★★★
()
Ответ на: комментарий от pyatak123
$(printf "%d\n" $a $b $c $d $e | sort -n | head -1)

не для 3-х переменных конечно.

Deleted
()
$ i1=15
$ i2=20
$ i3=10

$ set | grep 'i[0-9]=' | sort -t'=' -k2n
i3=10
i1=15
i2=20

$ set | grep 'i[0-9]=' | sort -t'=' -k2n | head -1
i3=10

$ echo "$i1 $i2 $i3" | tr ' ' '\n' | sort -n | head -1
10
anonymous
()
Ответ на: комментарий от anonymous
  • сортировка алгоритмически сложнее (результат всё равно почти весь отбрасывается)
  • требуется вызов внешних программ, что тоже небыстро (и вопрос про bash)
  • это работает только для первых двух случаев (из моего ответа), а ТС, вероятно, спрашивал про определение имени переменной с наименьшим значением
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от intelfx

незнаю что важнее, миллисекунды или доширак, но ты прав.

ТС, вероятно, спрашивал про определение имени переменной с наименьшим значением

решение уже проскакивало :)

Deleted
()
Ответ на: комментарий от intelfx

Работает такой вариант функции:

function min() {
    local arg="$1"
    min="$arg"
    while [ -n "$arg" ]; do
        if [ "$arg" -lt "$min" ]; then
            min="$arg";
        fi
        shift
        arg="$1"
    done
    echo "$min"
}
aureliano15 ★★
()
Ответ на: комментарий от fet4

Ну, имя можно просто подставить. Вот слегка модернизированный вариант с awk, предложенный pyatak123:

echo -e "a $a\nb $b\nc $c\nd $d" | awk '{if(min==""){min=max=$1}; if($2>max) {max=$2}; if($2< min) {min=$2; name=$1}; count+=1} END {print name "=" min}'
aureliano15 ★★
()
Ответ на: комментарий от intelfx

Ну, awk не я предложил. Я просто исправил. Но в данном случае awk гораздо короче функции. Функция хороша для общего случая, а для конкретного, имхо, проще awk. Ж-)

aureliano15 ★★
()
Ответ на: комментарий от intelfx

Заработало, Большое спасибо. Вариант с именем переменной - min_indirect() была ошибка в переменой min_name=$(min i1 i2 i3). Удалил _indirect в названии и все окей.

fet4
() автор топика
Ответ на: комментарий от intelfx

Извиняюсь. Всё работает. Просто там не стояло echo, я сначала не заметил, начал править функцию. Поправил, добавил echo, всё отработало. А сейчас запустил твой первоначальный вариант, но с echo, и тоже всё работает. :-)

aureliano15 ★★
()
Ответ на: комментарий от fet4

Ух ты, а я и не заметил, что опечатался в вызове. Когда проверял, только функцию в терминал скопипастил, а тремя строчками ниже не посмотрел =)

intelfx ★★★★★
()
i1=1
i2=0
i3=7
min=100500
minvar=foobar
for i in 1 2 3; do
  var=i$i
  if [ ${!var} -lt $min ]; then
    min=${!var}
    minvar=$var
  fi
done
echo "Variable with min value: $minvar has value $min"

------

Variable with min value: i2 has value 0
Komintern ★★★★★
()
Ответ на: комментарий от Komintern

Работает, по-моему еще и проще) Спасибо.

fet4
() автор топика
Ответ на: комментарий от intelfx

сортировка алгоритмически сложнее (результат всё равно почти весь отбрасывается)

тег «bash» не видно?

требуется вызов внешних программ

за то программы на нормальном ЯП. (ну хотя-бы на перловке).

emulek
()
Ответ на: комментарий от fet4

А можно по строчно расписать логику?!

буду краток: говно. В каждой строке ошибки.

И что означает конструкция ${!var} ?

ключ(имя в массиве, или число, если массив обычный).

вот: http://www.linuxjournal.com/content/bash-arrays

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.