[英]Bash script and manually running commands on the command line
我有以下简单的bash脚本,该脚本从stdin接收输入并打印出作为输入给出的第三行。
#!/bin/bash
var=$(cat)
echo $var | head -n 3 | tail -n 1
该脚本的问题在于它会打印所有行,但这是有趣的部分,当我在命令行上分别键入命令时,我会得到预期的结果,即第三行。 为什么会出现这种异常? 我在这里做错什么了吗?
head -n 3 | tail -n 1
的目标head -n 3 | tail -n 1
head -n 3 | tail -n 1
是将第三行保留为变量使用内建的read会更有效
read
read
read var
echo "${var}"
还是要保持空白
IFS= read
而没有加入结尾线\\
还是不给特殊的意义\\
read -r
您的脚本中不需要$(cat)
。 如果脚本正在从stdin中读取数据,则只需在脚本中添加以下这一行:
head -n 3 | tail -n 1
并运行为:
bash myscript.sh < file.txt
这将从file.txt
打印第三行
PS:您可以使用此更快的sed
替换head + tail
,以从输入中打印第三行:
sed '3q;d'
外壳正在拆分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.
读取stdin.
read -d '' var << EOF
echo "$var" | head -n 3 | tail -n 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.