正しい解決策。

正しい解決策。

/bin/sh.

入力ファイルを求める行があります。

read -p "goat may try to change directory if cd fails to do so. Would you like to add this feature? [Y|n] " REPLY

この長い行を複数行に分けて、各行が80文字を超えないようにしたいと思います。私が言ったことソースコードの1行スクリプト化されました。いいえスクリプト実行時に実際に画面に出力されるラインについて!

私が試したこと:

  • 最初の方法:

    read -p "oat may try to change directory if cd fails to do so. " \
        "Would you like to add this feature? [Y|n] " REPLY
    

    印刷されないため機能しませんWould you like to add this feature? [Y|n]

  • 2番目の方法:

    echo "oat may try to change directory if cd fails to do so. " \
        "Would you like to add this feature? [Y|n] "
    read REPLY
    

    効果もあまり良くありません。プロンプトの後に改行文字を印刷します。-nオプションを追加してもecho役に立ちません。次の内容だけが印刷されます。

    -n goat oat may try to change directory if cd fails to do so. Would you like to add this feature? [Y|n]
    # empty line here
    
  • 私の現在の解決策は

    printf '%s %s ' \
        "oat may try to change directory if cd fails to do so." \
        "Would you like to add this feature? [Y|n] "
    read REPLY
    

もっと良い方法があるのだろうか。

/bin/sh私が互換性のあるソリューションを探していることに注意してください。

答え1

まず、変数を使用してテキスト行から読み取りを分離してみましょう。

text="line-1 line-2"             ### Just an example.
read -p "$text" REPLY

これにより、質問は変数に2行を割り当てる方法になります。

もちろん、これを行うための最初の試みは次のとおりです。

a="line-1 \
line-2"

このように書くと、varはa実際に値を取得しますline-1 line-2

ただし、これによって発生するインデントの欠如が気に入らない場合は、ここのドキュメントの行をvarとして読むことができます(ここでのインデントの行が正しく機能するには空白ではなくタブが必要になることに注意してください)。

    a="$(cat <<-_set_a_variable_
        line-1
        line-2
        _set_a_variable_
    )"
echo "test1 <$a>"

ただし、実際には2つの行が作成されたため失敗します$a。 1行だけを取得する回避策は次のとおりです。

    a="$( echo $(cat <<-_set_a_variable_
        line 1
        line 2
        _set_a_variable_
        ) )"
echo "test2 <$a>"

これは近いですが、他の追加の問題を引き起こします。

正しい解決策。

上記のすべての試みは問題をより複雑にするだけです。

非常に基本的で簡単な方法は次のとおりです。

a="line-1"
a="$a line-2"
read -p "$a" REPLY

特定の例のコードは(readサポートされているすべてのシェルに対して-p)次のようになります。

#!/bin/dash
    a="goat can try change directory if cd fails to do so."
    a="$a Would you like to add this feature? [Y|n] "
# absolute freedom to indent as you see fit.
        read -p "$a" REPLY

他のすべてのシェルの場合は、次を使用します。

#!/bin/dash
    a="goat can try change directory if cd fails to do so."
    a="$a Would you like to add this feature? [Y|n] "
# absolute freedom to indent as you see fit.
        printf '%s' "$a"; read REPLY

答え2

私が見つけた@BinaryZebraのやり方変数の使用はよりきれいですが、必要な方法で使用することもできます。改行文字を引用符で囲むことができます。

read -p "goat can try change directory if cd fails to do so. \
Would you like to add this feature? [Y|n] " REPLY

答え3

行末のバックスラッシュを使用すると、出力で実際の改行ではなく複数行でコマンドを続行できます。

たとえば、最初の方法はコマンドになります。

read -p "goat can try change directory if cd fails to do so. " "Would you like to add this feature? [Y|n] " REPLY

なぜ複数行の出力を読みたいのか分かりませんが、readプロンプト行とecho前の行についてのみ読みたいのですが。

複数行のコードを読みやすくするには、行間で引用符を閉じたり開いたりしないでください。

この試み:

read -p "goat can try change directory if cd fails to do so. \
Would you like to add this feature? [Y|n] " REPLY

答え4

これはどうですか:

#!/bin/bash
読む -p "こんにちは
世界
これは
複数行
ヒント:「ヒント
エコ$ヒント

関連情報