首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash脚本和在命令行上手动运行命令

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

Stack Overflow用户
提问于 2017-05-24 22:00:47
回答 5查看 75关注 0票数 0

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

代码语言:javascript
运行
复制
#!/bin/bash

var=$(cat)

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

这个脚本的问题是它打印所有行,但有趣的是,当我在命令行中单独输入命令时,我得到了预期的结果,即第三行。为什么会出现这种反常现象?我是不是做错了什么?

EN

回答 5

Stack Overflow用户

发布于 2017-05-24 22:31:42

head -n 3 | tail -n 1的目的是将第三行保存在变量中。使用读内建会更有效。

代码语言:javascript
运行
复制
read
read
read var
echo "${var}"

或者继续使用空格

代码语言:javascript
运行
复制
IFS= read

并且不连接以\结尾的行,或者不赋予\特殊含义

代码语言:javascript
运行
复制
read -r
票数 1
EN

Stack Overflow用户

发布于 2017-05-24 22:44:16

您不需要在脚本中使用$(cat)。如果脚本正在从标准输入中读取数据,那么只需在脚本中使用这一行:

代码语言:javascript
运行
复制
head -n 3 | tail -n 1

并按如下方式运行:

代码语言:javascript
运行
复制
bash myscript.sh < file.txt

这将从file.txt打印第三行

PS:你可以用这个更快的sed替换head + tail,从输入开始打印第三行:

代码语言:javascript
运行
复制
sed '3q;d'
票数 1
EN

Stack Overflow用户

发布于 2017-05-24 22:17:26

shell将拆分var变量,因此echo将获取多个参数。你需要引用你的变量来防止这种情况的发生:

代码语言:javascript
运行
复制
#!/bin/bash

var=$(cat)

echo "$var" | head -n 3 | tail -n 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44160658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档