我有以下简单的bash脚本,它从stdin获取输入并打印作为输入给出的第三行。
#!/bin/bash
var=$(cat)
echo $var | head -n 3 | tail -n 1
这个脚本的问题是它打印了所有的行,但这里是有趣的部分,当我在命令行上单独输入命令时,我得到了预期的结果,即第三行。为什么这个异常?我在这里做错了吗?
答案 0 :(得分:1)
head -n 3 | tail -n 1
的目的是使第三行保持变量
使用read builtin
read
read
read var
echo "${var}"
或继续标题白色空间
IFS= read
并且不加入以\
结尾的行,或者不对\
read -r
答案 1 :(得分:1)
您的脚本中不需要foo
。如果脚本正在从stdin读取数据,那么在脚本中只需要这一行:
$(cat)
并按以下方式运行:
head -n 3 | tail -n 1
这将从bash myscript.sh < file.txt
PS:您可以使用此file.txt
更快地替换head + tail
,以便从输入中打印第3行:
sed
答案 2 :(得分:0)
shell正在拆分var
变量,因此echo获取多个参数。您需要引用变量以防止这种情况发生:
#!/bin/bash
var=$(cat)
echo "$var" | head -n 3 | tail -n 1
答案 3 :(得分:0)
据我理解你的问题,这应该可以解决问题:
#!/bin/bash
var=$(cat)
echo "$var" | head -n 3 | tail -n 1
答案 4 :(得分:0)
var=$(cat)
不允许您退出stdin
模式。您需要为脚本指定EOF
以便停止阅读stdin.
read -d '' var << EOF
echo "$var" | head -n 3 | tail -n 1