問題がある投稿を報告するはじめにGoogleさんがShellスタイルガイドを共有していたので、いくつか気になった点をピックアップしました。自分のShellスタイルはかなり我流なので、自省の意味も込めてコメントも併記します。(今回はこちら)http://google.github.io/styleguide/shell.xml本当は人間がチェックするのではなくcpplintのためXML定義なのかもですが、気にしない気にしない。(見たところcpplintはc++だけだと思ってます)commitフックでshell系のlint走らせろっていうのが今風なのかもしれませんが、キニシナイキニシナイ。利用可能なShellについてBashのみ利用可能。従って#!/bin/bashで始めましょう。本来の機能を壊さないようShellのオプションを使うためのフラグを多用しないこと。setを使いましょう。利用シーン小さいツールやスクリプト実行時のラップ程度にShellの利用を抑えること。100行超えるとPythonとか他の言語を使おうこと。雑記(ちょっとしたツール目的でも100行すぐ超えちゃいますね。SUID/SGIDについてセキュリティ的な課題や他の実機への横展開が難しくなるのでSUID/SGIDの利用は禁止。全てのエラーメッセージはSTDOUTではなくSTDERRに出力すること。正常な状態と異常な状態を簡単に区別できるようにするためです。下記のような関数を作っておくのがおススメ。"hogehoge"と標準出力してました。コメントファイルShellの機能を示す簡潔なトップレベルコメントを必ず書くこと。関数ステップ数・複雑度に関係なく全ての関数にコメントを付けること。...}雑記(Utilityぽい関数ではノーコメント派でした。TODO一時的にTODOを使う場合は、ユーザ名と補足内容を書くこと。Issueの番号も書ければ望ましい。インデントタブではなく、2スペース。パイプ1パイプなら1行。複数行なら改行して、2スペースを開けてパイプで繋げましょう。command4雑記(あんまり行数増やしたくないんで、今までは長くなったら適当に改行してました。ループ;とdoとthenは、forとwhileとifと同じ行に書くこと。fidone雑記(主観ですがネット上のサンプルでは、doやthenの改行派が多そうなイメージです。一般的に"$var"より"${var}"が推奨です。詳細なルールは以下を確認してください。クオートシングルクォートは置換が必要ないとき。ダブルクォートは置換が必要なときに利用する。$(command)バッククォートではなく$(command)が推奨。]]は[やtestより推奨。]]が引数なしや複数引数の場合でもエラーにならず、正規表現が使えるため。ワイルドカード*の代わりに./*を使おう。関数名はlower_caseで命名すること。命名:変数ループ変数は似たような名前にすること。ORACLE_SID='PROD'雑記(よく見かけますね。関数内でしか用いない変数にはlocalで宣言すること。グローバルネーム空間の汚染を防ぐことが出来ます。代入する値がコマンド置換の場合は、localの宣言と分けること。コマンド結果を代入する場合は、ワンセンテンスで書かないこと。CONSISTENT.まとめコーディング規約を読むと、ハマりどころな観点もまとまっているので勉強になりおすすめですJavaとかもそうですが糖衣構文などで複数の書き方があると、規約が必要になってくるので大変ですね。はじめにGoogleさんがShellスタイルガイドを共有していたので、いくつか気になった点をピックアップしました。自分のShellスタイルはかなり我流なので、自省の意味も込めてコメントも併記します。(今回はこちら)http://google.github.io/styleguide/shell.xml本当は人間がチェックするのではなく[cpplint](https://github.com/google/styleguide/tree/gh-pages/cpplint)のためXML定義なのかもですが、気にしない気にしない。(見たところcpplintはc++だけだと思ってます)commitフックでshell系のlint走らせろっていうのが今風なのかもしれませんが、キニシナイキニシナイ。利用可能なShellについて`Bash`のみ利用可能。本来の機能を壊さないようShellのオプションを使うためのフラグを多用しないこと。`set`を使いましょう。利用シーン小さいツールやスクリプト実行時のラップ程度にShellの利用を抑えること。100行超えるとPythonとか他の言語を使おうこと。**雑記**(ちょっとしたツール目的でも100行すぐ超えちゃいますね。SUID/SGIDについてセキュリティ的な課題や他の実機への横展開が難しくなるので`SUID/SGID`の利用は禁止。全てのエラーメッセージは`STDOUT`ではなく`STDERR`に出力すること。正常な状態と異常な状態を簡単に区別できるようにするためです。下記のような関数を作っておくのがおススメ。"hogehoge"`と標準出力してました。Shellの機能を示す簡潔なトップレベルコメントを必ず書くこと。ステップ数・複雑度に関係なく全ての関数にコメントを付けること。{...}```**雑記**(Utilityぽい関数ではノーコメント派でした。TODO一時的にTODOを使う場合は、ユーザ名と補足内容を書くこと。Issueの番号も書ければ望ましい。インデントタブではなく、2スペース。パイプ1パイプなら1行。複数行なら改行して、2スペースを開けてパイプで繋げましょう。command4```**雑記**(あんまり行数増やしたくないんで、今までは長くなったら適当に改行してました。ループ`;`と`do`と`then`は、`for`と`while`と`if`と同じ行に書くこと。thenerror_messagefifidone```**雑記**(主観ですがネット上のサンプルでは、`do`や`then`の改行派が多そうなイメージです。一般的に`"$var"`より`"${var}"`が推奨です。詳細なルールは以下を確認してください。クオートシングルクォートは置換が必要ないとき。ダブルクォートは置換が必要なときに利用する。$(command)バッククォートではなく$(command)が推奨。]]`は`[`や`test`より推奨。`が引数なしや複数引数の場合でもエラーにならず、正規表現が使えるため。ワイルドカード`*`の代わりに`./*`を使おう。関数名はlower_caseで命名すること。命名:変数ループ変数は似たような名前にすること。環境変数はSNAKE_CASEにする。ORACLE_SID='PROD'```**雑記**(よく見かけますね。関数内でしか用いない変数には`local`で宣言すること。グローバルネーム空間の汚染を防ぐことが出来ます。代入する値がコマンド置換の場合は、localの宣言と分けること。コマンド結果を代入する場合は、ワンセンテンスで書かないこと。Javaとかもそうですが糖衣構文などで複数の書き方があると、規約が必要になってくるので大変ですね。スクリプトならバイナリを扱える。スクリプトならバイナリを扱える。送信いただいたご意見への返信は行っておりません。お問い合わせください。