/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 "こんにちは 世界 これは 複数行 ヒント:「ヒント エコ$ヒント