No editor de texto nano, posso canalizar a seleção para um comando e, muitas vezes, preciso centralizar o texto, então criei o seguinte código
center() {
str=$1
# Strip leading and trailing whitespace from the string
str=$(echo "$str" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
str_len=${#str}
margin=$(((80 - str_len) / 2))
printf "%*s%s%*s\n" $margin "" "$str" $margin ""
}
Mas não sei muito sobre scripts, então gostaria de saber como posso melhorar esse código.
Por que você está vinculando a uma solução bash? Eu não uso esse shell, só quero que ele rode com sh
Supondo que você esteja usando o
bash
shell (consulte o final desta resposta se não estiver usandobash
), você pode retirar os espaços em branco flanqueados da string de maneirastr
mais eficiente usando expansões de variáveis padrão e o padrão globbing estendido+([[:space:]])
(corresponde a um ou mais caracteres semelhantes a espaços):Gostaríamos de imprimir a string justificada à direita na coluna dada por ( w + s )/2, onde w é a largura do terminal (saída por
tput cols
, mas você também pode usar$COLUMNS
) e s é o comprimento da string (${#str}
):A função:
Observe que o corpo da função é um sub-shell. Isso é feito para que a configuração da
extglob
opção shell não transborde para o shell de chamada.Sem depender de
extglob
(funcionará em qualquersh
):Substitua
$(tput cols)
por80
se desejar formatá-lo para uma largura estática de 80 colunas.Se você não tiver vários espaços em branco concatenados no meio, poderá simplificar o corte com
str=$(echo $1)
Você não precisa acrescentar espaço em branco depois de
$str
.