bash 脚本中输出的干净格式

bash 脚本中输出的干净格式

我遇到了在运行时格式化输出同时保留某些脚本中代码格式的问题。以下内容对我有用,只是想检查一下是否合理?它似乎有点弄脏了代码,我对更好的解决方案感兴趣 - 我不想创建一个过于复杂的 bash 函数来处理所有可能的用例,以便格式化几行。我对一种可移植的解决方案感兴趣,该解决方案允许干净的代码和可预测的输出。

printf "\nLine one....
Line 2 - output on next line
Line 3, output on its own newline"

我注意到 printf 会自动拾取换行符,包括缩进,这允许轻松格式化文件中的输出,但如果您在缩进块中工作,则可能会影响脚本中的格式 -

if [ $# -ne 1 ]; then
  printf "\nLine one...
Line 2 - output on next line
Line 3, output on its own newline"
fi

如果我在块内适当缩进第 2 行和第 3 行,printf 将拾取空格(制表符)并在运行时将它们输出到我的脚本消息中。

我可以做这样的事情,分割行但在脚本和输出中保留我的格式吗?我希望将行的宽度保持在 80 个字符以下,这是合理的,但我也想正常使用 printf 格式,用 \n 控制换行符,而不是自动在换行符上缺少引号。多个 printf 语句是执行此操作的唯一方法吗?

编辑/解决此行下面的代码


参考下面 l0b0 接受的答案,我使用了与 %s 相反的 %b 参数,并用双引号而不是单引号初始化了 'lines' 变量。 %b arg 允许 printf 解析我的行中的转义序列,双引号似乎允许传递我之前创建的局部变量,以简化成功/错误消息的着色输出。

RED=$(tput setaf 1)
NORMAL=$(tput sgr0)
lines=( "\nEnter 1 to configure vim with the Klips repository, any other value to exit." \
  "The up-to-date .vimrc config can be found here: https://github.com/shaunrd0/klips/tree/master/configs" \
  "${RED}Configuring Vim with this tool will update / upgrade your packages${NORMAL}\n")

printf '%b\n' "${lines[@]}"
read cChoice

为了澄清我在这个问题中的缩进/间距 - vim 配置为将制表符扩展为空格,并在 .vimrc 中使用以下行 -

" Double-quotes is a comment written to be read
" Two Double-quotes ("") is commented out code and can be removed or added

" Set tabwidth=2, adjust Vim shiftwidth to the same
set tabstop=2 shiftwidth=2 

" expandtab inserts spaces instead of tabs
set expandtab 

答案1

如果使用制表符进行缩进(现在几乎已经灭绝)你可以使用这个技巧这里的文件:

if …
then
    cat <<- EOF
        first
        second
    EOF
fi

如果您在该命令中用制表符替换四个空格,它将打印与printf '%s\n' first second.

也就是说,printf '%s\n' …可能是一个更简单的解决方案– 这样每一行都是一个单独的争论printf

$ lines=('Line one...' 'Line 2 - output on next line' 'Line 3, output on its own newline')
$ printf '%s\n' "${lines[@]}"
Line one...
Line 2 - output on next line
Line 3, output on its own newline

相关内容