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

时间:2017-05-24 14:00:47

标签: linux bash shell

我有以下简单的bash脚本,它从stdin获取输入并打印作为输入给出的第三行。

#!/bin/bash

var=$(cat)

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

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

5 个答案:

答案 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

打印第3行

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