Bash脚本并在命令行上手动运行命令
我有以下简单的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}''或类似的吗? –