0

ヘルプのオプション-hを提供するスクリプトを書いています。ヘルプ メッセージを書き込もうとすると、次のように見栄えを良くしたいと思います。

print_help()
{
    printf "Usage: 
            ./prog -v version
                   -h help
                   -x ...."
}

スクリプトを実行すると、次のように、私が書いたとおりにヘルプ メッセージが出力されるはずです。

Usage: 
./prog -v version
       -h help
       -x ....

C では、次のように 2 つの文字列を 2 行で連結できます。

printf("Usage:\n"
       "./prog -v version\n"
       "       -h help\n"
       "       -x ....\n");

これらの 2 行は連結されてから出力されます。

シェルでほぼ同じことをしたいのですが、試しprintfてみましechoたが、うまくいかないようです。

他にアドバイスはありますか?

4

3 に答える 3

2

これを行うには2つの方法が考えられます

方法 1:複数の行に分けたい文字列を、二重引用符ではなく単一引用符で囲みます。

echo 'Usage: 
./prog -v version
       -h help
       -x ....'

出力:

Usage: 
./prog -v version
       -h help
       -x ....

説明:

一重引用符内のすべてに注意してください。

  • によって展開されません(そのため、内部bashなどの変数は使用できません)$var
  • 文字どおりに解釈されechoます (を使用しない限り、エスケープされた文字を含むecho -e)

方法 2 - メソッド内でインデントを使用するように更新:読みやすくするためにコード内で複数行に分割したい長い文字列が 1 つだけある場合は、次の\表記法で二重引用符を使用できます。

print_help() {
{
    echo \
    "Lorem ipsum dolor sit amet, consectetur adipisicing elit,"\
    "sed do eiusmod tempor incididunt ut labore et dolore magna"\
    "aliqua. Ut enim ad minim veniam, quis nostrud exercitation"\
    "ullamco laboris nisi ut aliquip ex ea commodo consequat."\
    "Duis aute irure dolor in reprehenderit in voluptate velit"
}

print_help

出力:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit

説明:

この\文字は、シェル スクリプトで行の最後の文字として使用される場合、行の継続を意味します (つまり、「やあ、この現在のコマンドにはさらに多くのものが来るので、すべてを読むまでまだ実行しないでください」と考えてください)。それの!」)


個人的には、出力を正確に取得するものをより細かく制御するためにecho -echars ( ) を使用およびエスケープできるため、2 番目のルートを好みます =)\n

于 2012-11-20T06:35:46.340 に答える
1

cat には醜いハックがあります (シェルが /bin/sh であると仮定します):

cat <<EOS
./prog -v version
  -h help
  -x ....
EOS

もっとうまくできるはずです...

編集: cat の代わりに「...」で echo を使用してください。誤解を招くような回答で申し訳ありません。

于 2012-11-20T06:35:16.240 に答える