2017-05-24 4 views
0

나는 다음과 같은 간단한 bash 스크립트를 사용하여 stdin에서 입력을 받고 입력으로 주어진 세 번째 행을 인쇄합니다. 내가 즉 세 번째 줄 예상 된 결과를 얻고 명령 행에 개별적으로 명령을 입력 할 때Bash 스크립트와 명령 행에서 수동으로 실행하는 명령

#!/bin/bash 

var=$(cat) 

echo $var | head -n 3 | tail -n 1 

이 스크립트의 문제는,이 모든 라인을 출력하지만, 여기에 재미있는 부분이다. 왜이 이상한가? 내가 여기서 뭔가 잘못하고있는거야?

+0

당신은 무엇인가를 입력하고 var에 저장하기 위해'cat'을 사용하고 있습니까? –

+0

이 모든 것을'sed -n '3 {p; q}' '또는 유사하게 축소 할 수 없습니까? –

답변

0

쉘이 var 변수를 분할하여 여러 매개 변수를 echo합니다. 이 일이 방지하기 위해 변수를 인용해야합니다

#!/bin/bash 

var=$(cat) 

echo "$var" | head -n 3 | tail -n 1 
0

이것은 지금까지의 내가 질문을 이해, 트릭을 수행해야합니다

#!/bin/bash 

var=$(cat) 

echo "$var" | head -n 3 | tail -n 1 
0
var=$(cat)stdin에서 탈출을 허용하지 않습니다

방법. 당신은 stdin.

read -d '' var << EOF 
echo "$var" | head -n 3 | tail -n 1 
+0

이것은'echo "$ var"'라인을 포함하고 파일의 끝으로 구분 된 here-doc입니다. –

+0

우연한 발견. 나는 항상 그것에 대해 읽었지만 고통을 이해하지 못했다 :) –

+0

내 말은, 이것은 문자열'echo | 머리 - n 3 | tail -n 1'을'var'에 넣습니다. –

1
내장

read 
read 
read var 
echo "${var}" 
읽을 사용하는 것이 더 효율적입니다 head -n 3 | tail -n 1의 목적은 변수 에 세 번째 라인을 유지하는 것입니다

에서 읽기 중지 이해하는 스크립트의 EOF를 지정해야

또는 제목 유지하는 백색 공간

IFS= read 

과로 끝나는 라인을 가입하지여부를 당신은 스크립트에서 $(cat) 필요하지 않습니다 \

read -r 
1

에 특별한 의미를 부여. 이 file.txt


에서 3 선을 인쇄합니다

bash myscript.sh < file.txt 

:

head -n 3 | tail -n 1 

을 그리고로 실행 : 스크립트는 다음 stdin에서 데이터를 읽는 경우 당신의 스크립트에이 한 줄이 추신 : sed으로 head + tail을 바꾸면 입력에서 세 번째 줄을 인쇄 할 수 있습니다.

sed '3q;d' 
관련 문제