piapia123
ja

シェルスクリプト整形

整形

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

インデントが失われたシェルスクリプトを整えます。if / fi、for / done、while / do、case / esac、関数本体、サブシェルが階層どおりに揃い、case の分岐ラベルは 1 段深く、;; は分岐の階層に戻ります。このツールが自分に課している線引きは「各行の先頭の空白だけを変える」ことです。行内の 1 文字も触りません。シェルは自由に組み替えられる言語ではありません。`<<EOF` から `EOF` までの内容はデータそのもので、空白 1 つで変わってしまいます。行継続や引用符内の改行も元の位置に依存します。代償として `if [ x ]; then echo ok; fi` を 3 行に展開することはしませんが、スクリプトを壊すこともありません。

機能

  • 構造に沿ったインデント:if / for / while / case / 関数本体 / サブシェル
  • case の分岐を個別に処理:分岐ラベルは 1 段深く、;; で分岐の階層に戻ります
  • 変えるのは行頭の空白のみ。行内の文字はそのまま
  • ヒアドキュメント(<<EOF)の間は逐字保持。インデントはデータを変えてしまいます
  • 複数行文字列の内部はそのまま。コメント内の引用符を文字列開始と誤認しません
  • 終了語のあとにリダイレクトが続く場合(done < file)も正しく揃います
  • インデント幅は 2 か 4。行末空白の削除と空行の圧縮も任意で選べます

使い方

  1. スクリプトを貼り付けます
  2. インデントがその場で整います
  3. 必要に応じて幅と 2 つの空白オプションを調整します
  4. 結果をコピーします

よくある質問

「圧縮」機能がないのはなぜですか?
シェルではそれが罠になるからです。コメントはヒアドキュメントの中に置かれることがあり、そこではデータなので削ると出力が変わります。末尾に改行のないスクリプトを 1 行にまとめると意味が変わります。&& やパイプの前後の改行も自由には動かせません。ほとんどのスクリプトは無事でしょうが、壊れるものは沈黙したまま実行時に奇妙な挙動を示します。そのためこのツールは行いません。
ヒアドキュメントをそのままにするのはなぜですか?
`<<EOF` から `EOF` までの各行は書き出されるデータであり、そこでのインデントは内容の一部だからです。インデントを付けることはスクリプトの出力内容を変えることになります。YAML やコード片を生成している場合、インデントがずれるとファイル全体が壊れます。`<<-` は先頭のタブのみ許可しますが、その区別も保っています。
スクリプトの動作は変わりますか?
変わりません。ツールは各行の先頭の空白だけを書き換え、その前にヒアドキュメントと複数行文字列を識別して除外します。行内の内容(余分な空白、特殊文字、コメント)はすべてそのままです。
スクリプトは送信されますか?
いいえ。整形はブラウザ内で完結し、ページはリクエストを送りません。デプロイ用スクリプトには鍵や社内アドレスが含まれることが多く、それらが端末から出ることはありません。

関連ツール