web-dev-qa-db-ja.com

STDINから複数の行を変数に読み込むにはどうすればよいですか?

私はこの質問を無駄にしています。私はここでビルドプロセスを自動化しています。私がやろうとしているのは、バージョン番号と、複数行のビルドの小さな説明を取得することだけです。これが実行されるシステムはOSX 10.6.8です。

CATの使用から、必要に応じて各行を処理するまですべてを見てきました。何を使うべきか、なぜ使うのか分かりません。

試み

read -d '' versionNotes

ユーザーがバックスペースキーを使用する必要がある場合、文字化けした入力になります。また、^ Dは終了せず、^ Cがプロセスを終了するだけなので、入力を終了する良い方法はありません。

read -d 'END' versionNotes

機能しますが、バックスペースキーが必要な場合でも入力が文字化けします。

while read versionNotes
do
  echo "  $versionNotes" >> "source/application.yml"
done

入力を適切に終了しません(空の文字列との一致を検索するには遅すぎるため)。

26
Robert K

man bashについて言及"…

コマンド置換$(cat file)は、同等の高速な$(<file)で置き換えることができます。

…"

$ myVar=$(</dev/stdin)
hello
this is test
$ echo $myVar
hello this is test
$ echo "$myVar"
hello
this is test

これは言及する価値があることに同意します— echo "$myVar"は指定されたとおりに入力を表示します。

21
poige

これを試してください:

user@Host:~$ read -d '' x <<EOF
> mic
> check
> one
> two
> EOF

Without改行:

user@Host:~$ echo $x
mic check one two

With改行:

user@Host:~$ echo "$x"
mic
check
one
two
10
voices

すべてのbashスクリプトのニーズについては、優れた Bash Guide を参照してください。

特に、Bash FAQには、これが番号#1に含まれています。

ファイル(データストリーム、変数)を行ごと(またはフィールドごと)に読み取るにはどうすればよいですか

8
adaptr

Vim、picoなどのエディターを起動できます...

${VISUAL:-${EDITOR:-vi}} source/application.yml
2

この問題は、空白行ができるまで各行を処理することで解決しました。それは私の状況に十分に機能します。しかし、誰かがより良いソリューションを追加したい場合は、遠慮なくそうしてください。

echo "---
notes: |" > 'version.yml'

while read line
do
  # break if the line is empty
  [ -z "$line" ] && break
  echo "  $line" >> "source/application.yml"
done
2
Robert K

最初にいくつかの修正:

  1. 行の「エディション」を許可するには、readlineを使用する-eを使用します(bashの履歴とすべての編集機能があるため)
  2. -dは1文字しか使用できません。例えば。 「END」からは「E」を受け取り、ユーザーが「E」を書き込むたびに読み取りが停止します(私はそれがあなたが望むものではないと思います...)

これを行うにはいくつかの可能性があります。私は1行ずつ読み取りに行き、空の行が見つかったときに停止します(ただし、任意の停止ワードを設定できます)。

unset tmp
while :
do 
 read line
 [[ $line == "" ]] && tmp="${tmp:0:$((${#tmp}-1))}" && break
 tmp="$tmp"$line$'\n'
done
1
estani

いくつかの方法があります。

最も簡単な方法の1つは次のとおりです。

MYVAR=$(yourcommand)
echo $"MYVAR"

例えば:

MYVAR=$(ls /)
echo $"MYVAR"
0
Bertrand SCHITS

破壊にはxargsとctrl-dを使用した構成を使用しています。私はそれに完全に満足しているわけではありませんが、複数行のユーザー入力を取り、それを変数に詰め込む(フォーマットはそのまま)の仕事を確かに果たします。 (最初と3番目の割り当てでは、xargs入力の内容を引用符で囲みます。)

    printf '%s\n' "When finished hit ctrl-d on a new line to proceed.  " "" "" 
    # this will load the user's input into a variable instead of a file 
    reminderBody="\"" 
    reminderBody+=$( xargs -0 ) 
    reminderBody+="\"" 

メール(bash経由)で送信される電子メールの本文としてreminderBodyを使用します。

0
JamesIsIn