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文字未満に維持したいと思います。これは合理的なものですが、改行で引用符を自動的に欠落させるのではなく、\ nを制御して改行を制御するprintf形式を正常に使用したいと思います。複数の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 

ベストアンサー1

インデントにタブを使用する場合(今はほぼ絶滅)このトリックを使用することができます文書は次のとおりです。

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

そのコマンドで4つのスペースをタブに置き換えると同じように印刷されます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

おすすめ記事