#!/usr/bin/env bash set -o pipefail insert_date() { while read do local date_value date_value="$(date +"%b %d %T %s.%N")" echo "${date_value} ${REPLY}" done } fatal_error_handler() { local result="$?" local p_message="$1" local pid="${BASHPID}" (exit "${result}") || { ( cd "$(dirname "${BASH_SOURCE[1]}")" echo -n "${FUNCNAME[0]}: $(echo | insert_date)${PWD}/${BASH_SOURCE[1]##*/}:${BASH_LINENO[0]} ${FUNCNAME[1]}() PID(${pid})" ) [ "${p_message}" != "" ] && echo -n " ${p_message}" echo return "${result}" } >&2 } version_test_gt() { local version_a="$1" local version_b="$2" dpkg --compare-versions "${version_a}" gt "${version_b}" } main() { local dpkg_output dpkg_output="$(dpkg -l 'linux-image-[0-9]*' | awk '$1=="ii"')" || fatal_error_handler || return local name_container name_container=($(awk '{print $2}' <<< "${dpkg_output}")) || fatal_error_handler || return local version_container version_container=($(awk '{print $3}' <<< "${dpkg_output}")) || fatal_error_handler || return [ "${#name_container[@]}" = "${#version_container[@]}" ] || fatal_error_handler || return local idx1 for ((idx1=0; idx1<${#version_container[@]}-1; ++idx1)) do local idx2 for ((idx2=idx1+1; idx2<${#version_container[@]}; ++idx2)) do if version_test_gt "${version_container[idx1]}" "${version_container[idx2]}" then local tmp="${name_container[idx1]}" name_container[idx1]="${name_container[idx2]}" name_container[idx2]="${tmp}" local tmp="${version_container[idx1]}" version_container[idx1]="${version_container[idx2]}" version_container[idx2]="${tmp}" fi done done paste <(IFS=$'\n'; echo "${name_container[*]}") <(IFS=$'\n'; echo "${version_container[*]}") | column -t || fatal_error_handler || return } if [ "$0" = "${BASH_SOURCE[0]}" ] then LANG="C" main "$@" || fatal_error_handler fi