STDIN에서 변수로 여러 줄을 읽는 방법은 무엇입니까?


24

나는이 질문을 쓸데없는 것으로 인터넷 검색했습니다. 나는 직장에서 빌드 프로세스를 자동화하고 있는데, 내가하려고하는 것은 버전 번호와 빌드에 대한 작은 설명을 얻는 것입니다. 이것이 실행되는 시스템은 OSX 10.6.8입니다.

CAT 사용부터 필요에 따라 각 라인 처리에 이르기까지 모든 것을 보았습니다. 무엇을 사용해야하며 왜 그런지 알 수 없습니다.

시도

read -d '' versionNotes

사용자가 백 스페이스 키를 사용해야하는 경우 입력이 잘못되었습니다. 또한 ^ D는 종료되지 않고 ^ C는 프로세스를 종료하므로 입력을 종료하는 좋은 방법은 없습니다.

read -d 'END' versionNotes

작동하지만 백 스페이스 키가 필요한 경우 여전히 입력을 깨뜨립니다.

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

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


이 정보를 사용자로부터 얻었습니까?
glenn jackman

옳은; 스크립트를 실행할 때 사용자가 터미널 에이 정보를 입력하기를 원합니다.
Robert K

1
당신은 자신을 명확하게하지 않았다, 오히려 말하고 싶습니다.
poige

답변:


20

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


1
여러 줄 입력 후 중지하는 방법? Ctrl C를 누르면 중지되지만 변수는 저장되지 않습니다!
Nikhil

2
UNIX® 터미널에는 "징계"가 있습니다. en.wikipedia.org/wiki/Line_discipline • "eof"의 의미를 확인하십시오 • 읽거나 man stty현재 설정을 얻는 방법 알아보기
poige

2
ctrl-d를 중지하십시오.
freb

9

이 시도:

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

2
-d ''정확히 내가 필요한 것입니다. 감사합니다
Bruno Bronosky

@Bruno 나의 즐거움; 까다로운 것입니다. 특히 언뜻보기에는 상당히 표준 적으로 보입니다. 다양한 특유의 방해를 받으면 매우 유용 할 수 있습니다.
목소리


2

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

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

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

read -r대신 사용하십시오 .
adaptor

2

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

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

음 ... 어떻게하면 OP의 질문에 어떻게 대답할까요?
adaptor

스크립트에서 편집기를 시작할 수 있습니다.
미르 Vutcovici

그리고 그것은 정확히 무엇을 달성합니까? 그는 텍스트를 사용하고자 에서 , 스크립트의 파일이 아닌 쓰기 정보 파일을.
adaptor

그는 사용자로부터 텍스트를 읽고 파일에 쓰지 않았습니다. 질문에 추가 된 의견을 읽으십시오.
Mircea Vutcovici

1

먼저 몇 가지 수정 사항 :

  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

0

몇 가지 방법이 있습니다.

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

MYVAR=$(yourcommand)
echo $"MYVAR"

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

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

LS와 같은 쉘 명령을 실행하지 않는 것을 제외하고. 사용자에게 여러 줄 입력을 요청하고 있습니다.
Robert K

이것은 매우 나쁜 습관입니다. ls! 의 출력을 처리하지 마십시오 .
adaptor

@adaptr 우리는 모든 것을 들었습니다. 좋은 대안을 제안 하시겠습니까?
목소리

0

우리는 xargs와 ctrl-d를 사용하여 구성을 사용하고 있습니다. 나는 그것에 완벽하게 만족하지는 않지만 분명히 다중 라인 사용자 입력을 취하여 변수에 넣는 작업을 수행합니다 (손상없이 포맷). 첫 번째와 세 번째 할당은 xargs 입력 내용에 따옴표를 추가합니다.

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

우리는 전자 우편으로 발송되는 전자 우편 (bash를 통해)으로 reminderBody를 사용합니다.


-1

참조 : http://tldp.org/LDP/abs/html/internal.html#READR

사용 read하고있는 선 끝날 경우 참고 \줄 바꿈을 무시됩니다. 그래서 당신은 할 수 있습니다 :

#! / bin / bash

-p "version :"버전을 읽으십시오
에코 $ version

# 입력을 입력하고 "\"로 긴 줄을 끝낸 다음 끝에 끝을 입력하십시오.
-p "설명 :"설명 읽기
echo -e "$ version \ n $ description >> yourfile.txt

줄 바꿈이 무시 된 단락을 원한다면 예. 그러나 이것은 빌드 스크립트에 대해 생성 된 릴리스 노트 목록이므로 해당 줄 바꿈을 보존 할 수 있어야합니다. 예를 들어 글 머리 기호 목록을 입력하려고 할 수 있습니다.
Robert K

ABS는 끔찍한 비율의 괴물입니다. 그것의 90 %는 명백한 잘못이다.
adaptor

그것은 아니에요 나쁜.
목소리
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.