我有以下簡單的bash腳本,它從stdin獲取輸入並打印第三行作爲輸入。Bash腳本並在命令行上手動運行命令
#!/bin/bash
var=$(cat)
echo $var | head -n 3 | tail -n 1
與該腳本的問題是,它打印所有的行,但這裏是好笑的,當我在命令行上單獨鍵入命令我得到預期的結果,即第三行。爲什麼這個異常?我在這裏做錯了什麼?
我有以下簡單的bash腳本,它從stdin獲取輸入並打印第三行作爲輸入。Bash腳本並在命令行上手動運行命令
#!/bin/bash
var=$(cat)
echo $var | head -n 3 | tail -n 1
與該腳本的問題是,它打印所有的行,但這裏是好笑的,當我在命令行上單獨鍵入命令我得到預期的結果,即第三行。爲什麼這個異常?我在這裏做錯了什麼?
shell正在拆分var
變量,所以echo得到多個參數。你需要引用您的變量來防止這種情況發生:
#!/bin/bash
var=$(cat)
echo "$var" | head -n 3 | tail -n 1
這應該做的伎倆,據我理解你的問題:
#!/bin/bash
var=$(cat)
echo "$var" | head -n 3 | tail -n 1
var=$(cat)
不會讓你逃脫出來的stdin
模式。你需要指定EOF
的腳本來理解,以阻止stdin.
read -d '' var << EOF
echo "$var" | head -n 3 | tail -n 1
這是一個包含'echo「$ var」'行的文檔,由文件結尾分隔。 –
意外發現。我總是閱讀它,但從來沒有把痛苦去理解它:) –
我的意思是,這將把字符串'echo |頭-n 3 | tail -n 1'到'var'中,這幾乎不是你想要的。 –
的head -n 3 | tail -n 1
的目的是保持第三線爲可變 這將是更有效地使用讀取內置
read
read
read var
echo "${var}"
閱讀
,或保持航向的空格
IFS= read
,並沒有加入以結束行還是不給特殊的意義\
read -r
你不要在你的腳本需要$(cat)
。如果腳本是從那麼標準輸入讀取數據只有這個單行在您的腳本:
head -n 3 | tail -n 1
並運行它爲:
bash myscript.sh < file.txt
這將打印3號線從file.txt
PS:您可以用這個更快的sed
代替head + tail
從輸入打印第3行:
sed '3q;d'
你是不是專門使用'cat'來輸入內容並存入var? –
難道你不能把所有這些縮小到'sed -n'3 {p; q}''或類似的嗎? –