[server] 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

빈 문자열과 일치하는 것을 찾기에는 너무 늦었 기 때문에 입력을 올바르게 끝내지 않습니다.



답변

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".


답변

이 시도:

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

줄 바꿈 없이 :

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

줄 바꿈 :

user@host:~$ echo "$x"
mic
check
one
two


답변

모든 bash 스크립팅 요구 사항 에 대해서는 우수한 Bash 안내서 를 참조하십시오 .

특히 Bash FAQ는 1 번에 이것을 포함합니다 :

파일 (데이터 스트림, 변수)을 한 줄씩 (및 / 또는 필드별로) 어떻게 읽을 수 있습니까?


답변

빈 줄이 생길 때까지 각 줄을 처리 하여이 문제를 해결했습니다. 내 상황에 잘 맞습니다. 그러나 누군가가 더 나은 솔루션을 추가하고 싶다면 자유롭게 그렇게하십시오.

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

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


답변

vim, pico와 같은 편집기를 시작할 수 있습니다 …

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


답변

먼저 몇 가지 수정 사항 :

  1. 라인에서 “에디션”을 허용하려면 -ereadline을 사용하십시오.
  2. -d하나의 문자 만 사용합니다. 예를 들어 ‘END’에서 ‘E’를 사용하고 사용자가 ‘E’를 쓸 때마다 판독이 중지됩니다 (그것이 당신이 원하는 것이 아니라고 생각합니다 …)

이를 수행 할 수있는 몇 가지 가능성이 있습니다. 한 줄씩 읽고 빈 줄을 찾으면 중지합니다 (중단 단어를 설정할 수는 있지만).

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


답변

몇 가지 방법이 있습니다.

가장 간단한 방법 중 하나는 다음과 같습니다.

MYVAR=$(yourcommand)
echo $"MYVAR"

예를 들면 다음과 같습니다.

MYVAR=$(ls /)
echo $"MYVAR"