作为一个简单的例子,我想写一个CLI脚本,它可以在终端窗口的整个宽度上打印=。

#!/usr/bin/env php
<?php
echo str_repeat('=', ???);

or

#!/usr/bin/env python
print '=' * ???

or

#!/usr/bin/env bash
x=0
while [ $x -lt ??? ]; do echo -n '='; let x=$x+1 done; echo

当前回答

yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'

其他回答

yes = | head -n$(($(tput lines) * $COLUMNS)) | tr -d '\n'

正如我在lyceus的回答中提到的,他的代码在非英语区域设置的窗口上将失败,因为mode的输出可能不包含子字符串“columns”或“lines”:

                                         

你可以找到正确的子字符串而不寻找文本:

 preg_match('/---+(\n[^|]+?){2}(?<cols>\d+)/', `mode`, $matches);
 $cols = $matches['cols'];

请注意,我甚至没有费心于线条,因为它不可靠(实际上我并不关心它们)。

编辑:根据对Windows 8的评论(哦,你…),我认为这可能更可靠:

 preg_match('/CON.*:(\n[^|]+?){3}(?<cols>\d+)/', `mode`, $matches);
 $cols = $matches['cols'];

不过一定要测试一下,因为我没有测试过。

Tput cols表示列数。 Tput行数告诉你行数。

在bash中,$LINES和$COLUMNS环境变量应该能够做到这一点。将在终端大小发生任何变化时自动设置。(即SIGWINCH信号)

获取窗口宽度

这个shell代码让一个全局变量$TERM_SIZE跟踪终端窗口的大小:

set_term_size() {
    TERM_SIZE="$(stty size 2>/dev/null)" && [ "$TERM_SIZE" ] ||
        TERM_SIZE='25 80'
}
trap set_term_size WINCH
set_term_size

它先尝试stty大小,然后再返回到假设终端有25行高和80个字符宽。POSIX并不强制要求stty '的大小操作数,因此需要回退。

然后你可以使用shell有限的字符串替换功能来访问columsn参数:

echo "${TERM_SIZE% *}" # Prints the terminal's height.
echo "${TERM_SIZE#* }" # Prints the terminal's width.

当然,您使用的脚本语言可能会提供一个库来为您处理这些问题——您应该使用它。

打印一行

一旦你知道了终端的宽度,打印一条水平线就很容易了,例如,通过滥用printf的字符串填充:

printf '%*s\n' "${TERM_SIZE#* }" '' | 
tr ' ' -

第一行告诉printf将与列一样多的空格(通过滥用字符串paddin)打印到管道中。注意,POSIX没有提到*语法,所以这可能不像上面的代码那样可移植。

第二行代码告诉tr从该管道读取数据,并将每个空格替换为连字符。