Вы можете просто проверить, подключен ли терминал к стандартному вводу (это то, что делает команда tty
). Добавьте эти строки в свой скрипт:
if ! tty >/dev/null; then
echo "Must be run from a tty"
exit 1
fi
Теперь ваш скрипт завершится с ошибкой, если он не будет запущен правильно:
$ ssh badabing ~/scripts/a.sh
Must be run from a tty
$ ssh badabing
terdon@badabing ~ $ ~/scripts/a.sh
Works!
printf '%s\n' "${array[@]}" | sort -n | tail -2 | head -1
Печатать каждое значение массива на отдельной строке, сортировать его, получать последние 2 значения, удалять последнее значение
secondGreatest=$(printf '%s\n' "${array[@]}" | sort -n | tail -2 | head -1)
Установите это значение для переменной secondGreatest
.
У Гленна Джекмана была отличная мысль о повторяющихся числах, которую я не учел. Если вас интересуют только уникальные значения, вы можете использовать флаг -u
вида:
secondGreatest=$(printf '%s\n' "${array[@]}" | sort -nu | tail -2 | head -1)
Это можно сделать с помощью специального -цикла bash по массиву; вы должны отслеживать самый большой и второй -самый большой. Единственная другая сложная часть заключается в том, чтобы быть осторожным с инициализацией этих значений; наибольшее значение инициализируется первым элементом; второе -наибольшее значение инициализируется в первый раз, когда мы видим значение, меньшее, чем наибольшее значение. Впоследствии для второго -наибольшего значения мы обновляем его только в том случае, если оно строго меньше текущего наибольшего значения:
#!/bin/bash
array=(7 7 6 2 1)
if [ "${#array[@]}" -lt 2 ]
then
echo Incoming array is not large enough >&2
exit 1
fi
largest=${array[0]}
secondGreatest='unset'
for((i=1; i < ${#array[@]}; i++))
do
if [[ ${array[i]} > $largest ]]
then
secondGreatest=$largest
largest=${array[i]}
elif (( ${array[i]} != $largest )) && { [[ "$secondGreatest" = "unset" ]] || [[ ${array[i]} > $secondGreatest ]]; }
then
secondGreatest=${array[i]}
fi
done
echo "secondGreatest = $secondGreatest"
Это все еще медленнее, чем вызов sort
, но имеет дополнительное преимущество, заключающееся в выборе строго -меньшего второго -наибольшего значения перед лицом нескольких высоких значений (, таких как 7
и 7
выше ).
Это хорошая работа для dc:
array=(1 2 7 6)
echo ${array[*]} | dc -f - -e '
[lasbdsa]sB
[dla!>Bsc1z>A]sA
lAx
[secondGreatest=]nlbp'