stdin에서 변수로 mutliline 입력을 읽는 방법과 쉘 (SH, Bash)에서 하나를 인쇄하는 방법은 무엇입니까?
문제
내가하고 싶은 것은 다음과 같습니다.
- 여러 줄 입력에서 읽으십시오
stdin
변수로A
- 다양한 작업을 수행합니다
A
- 파이프
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%|||}"