Como você descobriu, $COLUMNS
é útil apenas em um shell -i
interativo, então usamos columns="$(tput cols)"
.
O único problema que tenho é com a linha abaixo. Não centraliza o texto.
printf "%*s\n" $[$COLS/2] "$text"
Expandindo seu trabalho, aqui está uma função para exibir o texto centralizado (de um arquivo). Para chamá-lo dentro do seu script, use display_center "file.txt"
display_center(){
columns="$(tput cols)"
while IFS= read -r line; do
printf "%*s\n" $(( (${#line} + columns) / 2)) "$line"
done < "$1"
}
Observe o uso de ${#line}
(semelhante a wc -m
) para contar o número de caracteres na linha. Contanto que você só precise exibir texto simples sem cores / formatação, isso deve funcionar bem.
Aqui está uma função para exibir texto justificado à direita (de um arquivo) usando sua mesma implementação de printf.
display_right(){
columns="$(tput cols)"
while IFS= read -r line; do
printf "%*s\n" $columns "$line"
done < "$1"
}
Você também pode fazer coisas semelhantes com tput e echo, mas o exemplo abaixo não é tão robusto (ou seja, falhará com strings longas).
row=0
col=$(( ($(tput cols) - ${#text}) / 2))
tput clear
tput cup $row $col
echo "$text"
Além disso, você pode considerar usar dialog
ou select
para gerar seu menu. Isso tornaria seu script significativamente mais limpo.
link
link