#!/bin/bash -e function get_row() { local row _col IFS=';' read -rsdR -p $'\e[6n' row _col echo "${row#??}" } ROW="$(($(get_row) + 1))" function clear_output() { local row row="$(get_row)" for _ in $(seq "$ROW" "$row"); do printf '\e[1A\e[K' done } while true; do mapfile -t LSBLK <<< "$(lsblk -n --paths --list | grep part)" COLUMNS=1 select dev in "${LSBLK[@]}"; do if [ -z "$dev" ]; then clear_output break fi name="$(awk '{print $1}' <<< "$dev")" clear_output if mount | grep -q "$name"; then umount "$name" else udisksctl mount -b "$name" > /dev/null fi break done || exit done