简单的 bash/script 格式化工具,用于脚本中的段落文本?

Simple bash/script formatting tool, for paragraph text inside the script?

上下文:您知道如何在文字处理器中键入句子,如果您在段落中插入新句子,或者使现有句子变长或变短,则无需进行特殊格式化?

我正在写一些段落来记录给定脚本在其中的作用。我希望能够在用户使用“-help”等选项调用脚本时输出,但不必每次我添加一个句子或使一个句子变长或变短时都必须不断调整 echo 或 printf 语句。我该怎么做?

我愿意将输出设为 80 列或固定宽度。

编辑 READER:我发现所有答案都非常有用。

在 UNIX/Linux 中执行此操作的经典方法是 fold。这是一个例子:

     chicks ~ $ cat /etc/printcap  | fold -w 20
# This file was auto
matically generated 
by cupsd(8) from the
# /etc/cups/printers
.conf file.  All cha
nges to this file
# will be lost.
     chicks ~ $ cat /etc/printcap  | fold -w 40
# This file was automatically generated 
by cupsd(8) from the
# /etc/cups/printers.conf file.  All cha
nges to this file
# will be lost.
     chicks ~ $ cat /etc/printcap 
# This file was automatically generated by cupsd(8) from the
# /etc/cups/printers.conf file.  All changes to this file
# will be lost.

并让它看起来更像 Ray 的脚本:

$ echo "Ray wants to see how this works inside of a script" | fold -w 20
Ray wants to see how
 this works inside o
f a script
$ cat foo 
echo "Ray wants to see how this works inside of a script" | fold -w 20
$ bash foo
Ray wants to see how
 this works inside o
f a script
$

您可以使用广泛使用的 fmt 实用程序。

如果你有 Gnu coreutils(如果你正在使用 Linux,你几乎肯定会有),那么你可以使用它 the Gnu version. There is a very similar utility 在许多 BSD 系统上可用,包括 Mac OSX.

这是一个简单的示例,它应该适用于这些实现中的任何一个。请注意,第二段缩进了两个空格,并且保留了缩进:

description="\
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ornare leo non dolor porttitor
euismod. Cras
commodo, nisi vel gravida volutpat, enim turpis tempor eros, ut venenatis elit leo ut nunc. Nulla fermentum
ligula id tincidunt porttitor.

  Morbi ut massa vitae tortor rutrum
  gravida ut id nunc. Integer imperdiet pharetra augue, quis finibus justo
  luctus id. Phasellus a diam ac risus consequat pharetra. Cras
  lacinia neque
  sed ipsum euismod, non commodo felis facilisis.

Suspendisse luctus purus justo, sed iaculis lectus consequat nec. Etiam pretium ultricies
ligula, a pretium sapien facilisis eu. Nulla rhoncus viverra turpis a rutrum.
Cras eu porttitor urna. Duis nec metus vel nisi accumsan scelerisque. Cras lectus erat, mattis non mauris in, consectetur vulputate ipsum.
"
fmt -w 60 <<<"$description"

输出:

Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Aenean ornare leo non dolor porttitor euismod. Cras
commodo, nisi vel gravida volutpat, enim turpis tempor
eros, ut venenatis elit leo ut nunc. Nulla fermentum ligula
id tincidunt porttitor.

  Morbi ut massa vitae tortor rutrum gravida ut id
  nunc. Integer imperdiet pharetra augue, quis finibus
  justo luctus id. Phasellus a diam ac risus consequat
  pharetra. Cras lacinia neque sed ipsum euismod, non
  commodo felis facilisis.

Suspendisse luctus purus justo, sed iaculis lectus
consequat nec. Etiam pretium ultricies ligula, a pretium
sapien facilisis eu. Nulla rhoncus viverra turpis a rutrum.
Cras eu porttitor urna. Duis nec metus vel nisi accumsan
scelerisque. Cras lectus erat, mattis non mauris in,
consectetur vulputate ipsum.

将以上内容合并到脚本中。

您可以将其简单地添加到脚本中(感谢@ninjaj 关于使用 tput 获得所需列宽的建议。)

#!/bin/bash
description=... # as above, not repeated for space

# Check to see if the first argument is a cry for help
if [[  == -help ]]; then
  fmt -w $(tput cols) <<< "$description"
  exit 0
fi

如果我明白你在问什么,你想在脚本本身中包含描述脚本的文本,一个简单的方法是使用包含描述的 heredoc脚本,然后简单地测试 '-h''--help' 以显示您的描述。您可以通过将 heredoc 包装在一个函数中来获得相当大的灵活性,然后该函数可以用作通用 usage 函数来响应帮助、显示错误条件并设置退出任何给定情况的代码。

一个简单的例子是:

#!/bin/bash

maxval=127

usage() {

    local ecode=${2:-0}

    test -n "" && printf "\n %s\n" "" >&2

cat >&2 << MSG

 usage: ${0//*\//} srcdir tgtdir [maxname]  (maxname default: $maxval)

  This script will copy all files from 'srcdir' to 'tgtdir' with numeric names less 
  than 'maxname'.

 Options:

    -h  |  --help  program help (this file)
    -a  |  --all   copy all files from srcdir to tgtdir

MSG

    exit $ecode;
}

## respond to help
[ "" = -h -o "" = --help ] && usage

## example of error usage
[ -d "somedir" ] || usage "Error: directory does not exist" 2

MSG 标签之间的所有内容都包含 heredoc。文本可以根据您的喜好长短或详尽,并且比一系列 echoprintf 语句更容易维护。虽然它不会像 fmtflow 那样为您重排文本,但维护起来很简单,并且提供了使用 3rd 方工具的简单替代方法。

响应--help

的示例
$ bash usage.sh --help

 usage: usage.sh srcdir tgtdir [maxname]  (maxname default: 127)

  This script will copy all files from 'srcdir' to 'tgtdir' with numeric names less
  than 'maxname'.

 Options:

    -h  |  --help  program help (this file)
    -a  |  --all   copy all files from srcdir to tgtdir

显示错误情况的示例

$ bash usage.sh

 Error: directory does not exist

 usage: usage.sh srcdir tgtdir [maxname]  (maxname default: 127)

  This script will copy all files from 'srcdir' to 'tgtdir' with numeric names less
  than 'maxname'.

 Options:

    -h  |  --help  program help (this file)
    -a  |  --all   copy all files from srcdir to tgtdir

$ echo $?
2