在 nano 文本编辑器中,我可以将选择通过管道传输到命令中,而且我经常需要将文本居中,所以我想出了以下代码
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 ""
}
但我不太了解脚本,所以我想知道如何改进这段代码。
为什么要链接到 bash 解决方案?我不使用这个 shell,我只是想让它用 sh 运行
假设您正在使用
bash
shell(如果不使用 ,请参阅此答案的末尾),您可以使用标准变量扩展和扩展的 globbing 模式(匹配一个或多个类似空格的字符)更有效地bash
从字符串中去除侧翼空格:str
+([[:space:]])
我们希望将字符串右对齐打印到 ( w + s )/2 给出的列,其中w是终端的宽度(由 输出
tput cols
,但您也可以使用$COLUMNS
),s是字符串的长度 (${#str}
):功能:
请注意,函数体是一个子外壳。这样
extglob
shell 选项的设置就不会溢出到调用 shell 中。不依赖
extglob
(将在任何工作sh
):如果要将其格式化为静态 80 列宽度,请替换
$(tput cols)
为。80
如果你没有在中间连接多个空格,你可以简化修剪
str=$(echo $1)
您不需要在
$str
.