Bash脚本并在命令行上手动运行命令

问题描述:

我有以下简单的bash脚本,它从stdin获取输入并打印第三行作为输入。Bash脚本并在命令行上手动运行命令

#!/bin/bash 

var=$(cat) 

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

与该脚本的问题是,它打印所有的行,但这里是好笑的,当我在命令行上单独键入命令我得到预期的结果,即第三行。为什么这个异常?我在这里做错了什么?

+0

你是不是专门使用'cat'来输入内容并存入var? –

+0

难道你不能把所有这些缩小到'sed -n'3 {p; q}''或类似的吗? –

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 
+0

这是一个包含'echo“$ var”'行的文档,由文件结尾分隔。 –

+0

意外发现。我总是阅读它,但从来没有把痛苦去理解它:) –

+0

我的意思是,这将把字符串'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'