Bash

尋找一種在螢幕上一次查看文本文件行的方法

  • March 18, 2020

我正在尋找一種方法來獲取一個文本文件,並將每一行一次一個地放在螢幕中心,並具有一定的字元寬度。

有點像一個簡單的幻燈片放映,例如看到第一行直到使用者按下一個鍵,然後看到下一行,直到所有的行都被瀏覽完。

我懷疑在 bash 中有一種基本的方法可以做到這一點,但我還沒有找到答案。

像這樣的東西:

#!/usr/bin/env bash

if [ ! "$#" -eq 1 ]
then
   printf "Usage: %s <file>\n" "$0" >&2
   exit 1
fi

file="$1"

display_center(){
   clear
   columns="$(tput cols)"
   lines="$(tput lines)"
   down=$((lines / 2))
   printf '\n%.0s' $(seq 1 $down)
   printf "%*s\n" $(( (${#1} + columns) / 2)) "$1"
}

while IFS= read -r line
do
   display_center "$line"
   read -n 1 -s -r </dev/tty
done < "$file"

命名它centered.sh並像這樣使用:

./centered.sh centered.sh

它將列印給定文件中的每一行。按任意鍵顯示下一行。請注意,它尚未經過很好的測試,因此請謹慎使用,並且它始終會從螢幕中心開始列印行,因此它會使長行更多地出現在底部。

第一行:

#!/usr/bin/env bash

是個shebang。此外,我使用env的功能。我試圖避免使用 Bash 並在 POSIX shell 中編寫此腳本,但我放棄了,因為特別read是非常有問題。您應該記住,儘管 Bash 似乎無處不在,但預設情況下它並非無處不在,例如在 BSD 或帶有 Busybox 的小型嵌入式系統上。

在這部分:

if [ ! "$#" -eq 1 ]
then
   printf "Usage: %s <file>\n" "$0" >&2
   exit 1
fi

我們檢查使用者是否提供了一個參數,如果他們沒有,我們將使用資訊列印到標準錯誤並返回 1,這意味著父程序出錯。

這裡

file="$1"

我們將使用者傳遞的文件名參數分配給 file我們稍後將使用的變數。

這是一個實際列印居中文本的函式:

display_center(){
   clear
   columns="$(tput cols)"
   lines="$(tput lines)"
   down=$((lines / 2))
   printf '\n%.0s' $(seq 1 $down)
   printf "%*s\n" $(( (${#1} + columns) / 2)) "$1"
}

Bash 中沒有函式原型,因此您無法預先知道函式需要多少參數 - 一個只需要一個參數,該參數是要列印的一行,並且使用取消引用$1此函式首先清除螢幕,然後逐行向下移動/ 2 從螢幕頂部到達螢幕中心,然後使用我從這裡借來的方法列印居中線。

這是讀取使用者傳遞的輸入文件並呼叫 display_center()函式的循環:

while IFS= read -r line
do
   display_center "$line"
   read -n 1 -s -r </dev/tty
done < "$file"

read用於-n 1只讀取一個字元,-s不回顯來自終端的輸入並-r防止反斜杠損壞read您可以在中了解更多資訊help read。我們還直接從 /dev/tty 讀取,因為 stdin 已經指向文件 - 如果我們沒有告訴read從 /dev/tty 讀取,腳本將非常快速地列印文件中的所有行並立即退出,而無需等待使用者按一個鍵。

引用自:https://unix.stackexchange.com/questions/573235