Linux

清理 bash 腳本中的輸出格式

  • August 5, 2019

我在執行時遇到了格式化輸出的問題,同時在某些腳本中保留了程式碼的格式。以下對我有用,只是想檢查它是否合理?它似乎有點弄髒了程式碼,我會對更好的解決方案感興趣 - 我不想創建一個過於復雜的 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 參數允許 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 

如果您使用 Tab 字元進行縮進(現在幾乎已絕跡),您可以在此處的文件中使用此技巧:

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

引用自:https://unix.stackexchange.com/questions/533734