2017-05-24 240 views
0

我有以下簡單的bash腳本,它從stdin獲取輸入並打印第三行作爲輸入。Bash腳本並在命令行上手動運行命令

#!/bin/bash 

var=$(cat) 

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

與該腳本的問題是,它打印所有的行,但這裏是好笑的,當我在命令行上單獨鍵入命令我得到預期的結果,即第三行。爲什麼這個異常?我在這裏做錯了什麼?

+0

你是不是專門使用'cat'來輸入內容並存入var? –

+0

難道你不能把所有這些縮小到'sed -n'3 {p; q}''或類似的嗎? –

回答

0

shell正在拆分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模式。你需要指定EOF的腳本來理解,以阻止stdin.

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

這是一個包含'echo「$ var」'行的文檔,由文件結尾分隔。 –

+0

意外發現。我總是閱讀它,但從來沒有把痛苦去理解它:) –

+0

我的意思是,這將把字符串'echo |頭-n 3 | tail -n 1'到'var'中,這幾乎不是你想要的。 –

1

head -n 3 | tail -n 1的目的是保持第三線爲可變 這將是更有效地使用讀取內置

read 
read 
read var 
echo "${var}" 
閱讀

,或保持航向的空格

IFS= read 

,並沒有加入以結束行還是不給特殊的意義\

read -r 
1

你不要在你的腳本需要$(cat)。如果腳本是從那麼標準輸入讀取數據只有這個單行在您的腳本:

head -n 3 | tail -n 1 

並運行它爲:

bash myscript.sh < file.txt 

這將打印3號線從file.txt


PS:您可以用這個更快的sed代替head + tail從輸入打印第3行:

sed '3q;d'