2012-03-01 12 views
199

複数行のコマンドをBashスクリプトで記述する方法は分かっていますが、複数行のコマンドで行ごとにコメントを追加するにはどうすればよいですか?複数行コマンドの行コメントの挿入方法

CommandName InputFiles  \ # This is the comment for the 1st line 
      --option1 arg1 \ # This is the comment for the 2nd line 
      --option2 arg2 # This is the comment for the 3nd line 

しかし残念ながら、継続文字\後のコメントは、コマンドを中断します。

+0

コピーし、それに隣接したコメント/注釈付きブロックへのコードブロック、。 –

+0

L @ KのMarwanの答えです。それは全く独創的です。それは受け入れられた答えでなければなりません。 – SDsolar

+0

注:この問題とその解決策は、複数行の文字列にも適用されます。 – Blauhirn

答えて

34

私は恐らく、あなたが求めていることはできません。あなたができることは、コマンドの前の行、またはコマンド行の最後の1つのコメント、あるいはコマンドの後のコメントです。

このようにコマンド内にコメントを散在させることはできません。 \は、行をマージする意図を表しています。したがって、すべての目的と目的で、コメント行を1行に散りばめようとしていますが、これは動作しません。\は、 。

+2

とバックスラッシュと改行の間のコメント。 –

+0

受け入れられた答えは下記のMarwanです。 – springloaded

+1

マルワンの答えは賢明だが、代用の濫用のように感じる。私が言っていることがあれば、フィリップスの答えは私がやりたいことに近いものです。 '$ IFS'をハッキングを経由してサブシェルを必要としない、それを行うための別の方法は、 – Alec

44

あなたは配列内の引数を格納することができ:

args=(InputFiles  # This is the comment for the 1st line 
     # You can have whole lines of comments in between, useful for: 
     #--deprecated-option # This isn't use any more 
     --option1 arg1 # This is the comment for the 2nd line 

     # And even blank lines in between for readability 
     --option2 arg2 # This is the comment for the 3nd line 
    ) 
CommandName "${args[@]}" 

は、しかし、私はそれが各引数のコメントを許可する目的のためだけであれば、これは少しハックに見えると思います。したがって、コメントを書き換えて個々の引数を参照し、コマンド全体に置きます。

+3

これは、OPの例のような単純なもので動作しますが、 '>'や '<'、 '||'、 '&&'などをサポートしません。 – ruakh

+0

@Philipp Hmmm、ありがとう。これは良い回避策です。私の '--options arg'が' ''と '' 'の両方を持っていれば、ちょっと混乱するでしょう。 –

+0

@Philipp、私は本当にどちらが正解でなければならないのでしょうか?あなたの答えをアップウィニングし、ペリーの答えを正解とマークしました。 –

391

これは私のやり方です。基本的にBashのバックスティックcommand substitutionを使用すると、長いコマンドラインに沿って行間に分割されていてもこれらのコメントを置くことができます。

echo CommandName InputFiles `#1st comment` \ 
      --option1 arg1 `#2nd comment` \ 
      --option2 arg2 `#3rd comment` 

あなたは1行に異なるポイントで複数のコメントを置くことができます別の例:

some_cmd --opt1 `#1st comment` --opt2 `#2nd comment` --opt3 `#3rd comment` 
あなたが例を実行し、それがどのように動作するか見ることができるように、私はあなたの例の前にechoコマンドを入れています
+8

それも、パイプで連結されたサブコマンドの中に作品: "エコー\' \\ fooの '\#1(改行)|' '印刷' \ perlの-ne \ '#2" ...まさに私が必要! – EdwardTeach

+138

これは私が見た最も独創的な代用の乱用です! – WaelJ

+3

スクリプトファイルの長い複数行コマンドで特定のオプションの動作をブロックするときに、問題をすばやく解決すると便利です。 – Apostle

12

an another answer to this questionへのpjhのコメントに基づいて、IFSを空白以外の文字が含まれていないことがわかっている変数に置き換えます。あなたは、コードを更新する場合だけコメントブロックを更新することを忘れないでください

comment= 
who ${comment# This is the command} \ 
    -u ${comment# This is the argument} 
関連する問題