繁体   English   中英

Bash脚本和在命令行上手动运行的命令

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM