stdin에서 변수로 mutliline 입력을 읽는 방법과 쉘 (SH, Bash)에서 하나를 인쇄하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/212965

  •  03-07-2019
  •  | 
  •  

문제

내가하고 싶은 것은 다음과 같습니다.

  1. 여러 줄 입력에서 읽으십시오 stdin 변수로 A
  2. 다양한 작업을 수행합니다 A
  3. 파이프 A 분리기 기호를 잃지 않고 (\n,\r,\t등) 다른 명령에

최신 문제는 read Newline에서 읽기를 중지하기 때문에 명령.

나는 stdin을 읽을 수 있습니다 cat, 이와 같이:

my_var=`cat /dev/stdin`

, 그러나 인쇄하는 방법을 모르겠습니다. Newline, Tab 및 기타 구분 제가 여전히 존재하도록합니다.

내 샘플 스크립트는 다음과 같습니다.

#!/usr/local/bin/bash

A=`cat /dev/stdin`

if [ ${#A} -eq 0 ]; then
        exit 0
else
        cat ${A} | /usr/local/sbin/nextcommand
fi
도움이 되었습니까?

해결책

이것은 나를 위해 일하고 있습니다 :

myvar=`cat`

echo "$myvar"

주변의 인용문 $myvar 중요하다.

다른 팁

Bash에는 대안적인 방법이 있습니다. man bash 언급 :

명령 대체 $(cat file) 동등하지만 더 빠르게 대체 할 수 있습니다 $(< file).

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

일을한다

#!/bin/bash
myVar=$(tee)

네, 저도 저에게도 효과가 있습니다. 감사.

myvar=`cat`

와 같다

myvar=`cat /dev/stdin`

음. 로부터 bash 남자 페이지 :

이중 인용문으로 문자를 둘러싸는 문자는 $,`, , 히스토리 확장이 활성화 될 때를 제외하고 인용문 내의 모든 문자의 문자 값을 보존합니다. 캐릭터 $ 및`특별한 의미를 이중 인용문 내에서 유지합니다.

출력이 끝날 때 후행 신생을 보존하는 데 관심이있는 경우 다음을 사용하십시오.

myVar=$(cat; echo x)
myVar=${myVar%x}
printf %s "$myVar"

이것은 트릭을 사용합니다 여기.

업데이트

파이프에 아무것도 없으면이 과제는 무기한으로 매달릴 것입니다 ...

var="$(< /dev/stdin)"

타임 아웃을 통해이를 방지 할 수 있습니다 read 첫 번째 캐릭터를 위해. 시간이 지나면 리턴 코드는 128보다 크고 Stdin 파이프를 알게 될 것입니다 (일명 /dev/stdin) 비었다.

그렇지 않으면, 우리는 나머지 Stdin을 ... ...

  • 환경 IFS 단지 read 명령
  • 끄기는 탈출 -r
  • Read의 구분 기호를 제거합니다 -d ''.
  • 그리고 마지막으로, 우리가 처음에 얻은 캐릭터에 그것을 추가합니다.

따라서...

__=""
_stdin=""

read -N1 -t1 __  && {
  (( $? <= 128 ))  && {
    IFS= read -rd '' _stdin
    _stdin="$__$_stdin"
  }
}

이 기술은 사용을 피합니다 var="$(command ...)" 디자인에 의해 항상 모든 후행 신생 라인을 제거 할 명령 대체.

명령 대체가 선호되는 경우, 후행 신성민을 보존하기 위해 우리는 하나 이상의 구분 기자 문자를 내부의 출력에 추가 할 수 있습니다. $() 그런 다음 밖으로 벗겨냅니다.

예를 들어 ( 노트 $(parens) 첫 번째 명령과 ${braces} 두 번째로)...

_stdin="$(awk '{print}; END {print "|||"}' /dev/stdin)"
_stdin="${_stdin%|||}"
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top