Bagaimana cara membenarkan dan memusatkan teks dalam bash?

6

Pemula di sini. Saya mencari skrip bash ke tengah dan membenarkan teks. Skrip saya hanya berfungsi dengan satu baris teks. Bagaimana Anda memperbaikinya?

#!/bin/bash
COLS=$(tput cols)
while true; do
    clear
    echo -n "Type text "
    read text
    echo
    echo "Menu"
    echo "1) Right justify  "
    echo "2) Center "
    echo "3) Exit "
    echo
    echo -n "Choose [1-3]: "
    read opt
    echo
    case $opt in
        1) printf "%*s\n" $COLS "$text"
           break
        ;;
        2) printf "%*s\n" $[$COLS/2] "$text"
           break
        ;;      
        3) break
        ;;
        *)
        echo "Error. Press [1-3]"
        break
        ;;
    esac
done
Edward
sumber

Jawaban:

5

Seperti yang telah Anda temukan, $COLUMNS hanya berguna secara interaktif -i shell, jadi kami gunakan columns="$(tput cols)" sebagai gantinya.

Satu-satunya masalah yang saya miliki adalah dengan baris di bawah ini. Tidak memusatkan teks.
printf "%*s\n" $[$COLS/2] "$text"

Memperluas pekerjaan Anda, berikut adalah fungsi untuk menampilkan teks terpusat (dari dari file). Untuk menyebutnya dalam skrip Anda, gunakan display_center "file.txt"

display_center(){
    columns="$(tput cols)"
    while IFS= read -r line; do
        printf "%*s\n" $(( (${#line} + columns) / 2)) "$line"
    done < "$1"
}

Perhatikan penggunaan ${#line} (mirip dengan wc -m ) untuk menghitung jumlah karakter dalam baris. Selama Anda hanya perlu menampilkan teks biasa tanpa warna / format, maka ini akan berfungsi dengan baik.

Berikut adalah fungsi untuk menampilkan teks yang dibenarkan benar (dari file) menggunakan implementasi printf Anda yang sama.

display_right(){
    columns="$(tput cols)"
    while IFS= read -r line; do
        printf "%*s\n" $columns "$line"
    done < "$1"
}

Anda juga dapat melakukan hal serupa dengan tput dan gema, tetapi contoh di bawah ini tidak begitu kuat (mis. Akan gagal dengan string panjang).

row=0
col=$(( ($(tput cols) - ${#text}) / 2))
tput clear
tput cup $row $col
echo "$text"

Juga, Anda mungkin ingin mempertimbangkan untuk menggunakan dialog atau select untuk menghasilkan menu Anda. Itu akan membuat skrip Anda lebih bersih.
http://bash.cyberciti.biz/guide/Select_loop
https://serverfault.com/questions/144939/multi-select-menu-in-bash-script

Six
sumber
3
#!/usr/bin/awk -f
{
  z = 92 - length
  y = int(z / 2)
  x = z - y
  printf "%*s%s%*s\n", x, "", $0, y, ""
}

Memasukkan

hello world
alpha bravo charlie delta

Keluaran

                                         hello world
                                  alpha bravo charlie delta
Steven Penny
sumber
2
awk '{ z = '$(tput cols)' - length; y = int(z / 2); x = z - y; printf "%*s%s%*s\n", x, "", $0, y, ""; }'
galva