我遇到了在运行时格式化输出同时保留某些脚本中代码格式的问题。以下内容对我有用,只是想检查一下是否合理?它似乎有点弄脏了代码,我对更好的解决方案感兴趣 - 我不想创建一个过于复杂的 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