尋找一種在螢幕上一次查看文本文件行的方法
我正在尋找一種方法來獲取一個文本文件,並將每一行一次一個地放在螢幕中心,並具有一定的字元寬度。
有點像一個簡單的幻燈片放映,例如看到第一行直到使用者按下一個鍵,然後看到下一行,直到所有的行都被瀏覽完。
我懷疑在 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 讀取,腳本將非常快速地列印文件中的所有行並立即退出,而無需等待使用者按一個鍵。