免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2302 | 回复: 6
打印 上一主题 下一主题

如何判断script是否有来自管道的输入 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-17 12:43 |只看该作者 |倒序浏览
我的script需要像awk、sed一样既可以从管道接收数据,也可以从文件接收数据,即:
可以
1、ls | my.sh param-list
2、my.sh param-list inputfile
脚本里面符合判断是否有管道输入,
不管 wc -l 还是 awk ,如果没有管道输入脚本执行就会等待输入了

论坛徽章:
0
2 [报告]
发表于 2007-10-17 13:16 |只看该作者
假设:

你分析参数后,获得用户输入的是文件(需要从文件中获取信息)[按照你的要求,应该是最后一个参数,假设变量名为file]

  1. #参数分析
  2. [ -f "$file" ] && exec <"$file"
  3. while read line
  4. do
  5.    echo $line
  6. done
复制代码

论坛徽章:
0
3 [报告]
发表于 2007-10-17 17:18 |只看该作者

回复 #2 springwind426 的帖子

楼上的回答似乎还是不行哇?
根据楼上的意思,假设my.sh的内容如下:

  1. #!/bin/sh
  2. [ -f "$1" ] && exec <"$1"
  3. while read line
  4. do
  5.    echo $line
  6. done
复制代码

这样如果直接执行 % my.sh
不还是会挂起等待输入么?
迷惑中~~~

[ 本帖最后由 ylgtang 于 2007-10-17 17:19 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2007-10-17 17:50 |只看该作者
楼主要的是这效果吧?

  1. /home/lee/test#cat _grep
  2. #!/bin/bash
  3. if [[ $# -eq 2 ]];then
  4.         while read line;do
  5.                 [[ $line == "$1" ]] && echo $line
  6.         done<$2
  7.         elif [[ $# -eq 1 ]];then
  8.                 while read line;do
  9.                 [[ $line == "$1" ]] && echo $line
  10.         done
  11.         else
  12.                 exit
  13. fi
复制代码
/home/lee/test#ls
a  a.txt  b  _grep
/home/lee/test#ls|./_grep a.*
a.txt
/home/lee/test#ls|./_grep a
a
/home/lee/test#cat a.txt
abc
def
/home/lee/test#./_grep abc a.txt
abc
/home/lee/test#./_grep
/home/lee/test#

如果做的像awk、sed一样, 很难, 而且也没必要

[ 本帖最后由 寂寞烈火 于 2007-10-17 17:53 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-10-17 17:54 |只看该作者
2楼写的很好,请楼主理解一下管道的输入输出是什么

既然楼主认为此script有问题,没有awk,sed的管道行为,那么你可以试试以下3组命令, 对比一下awk和my.sh的行为:

awk '{print}'
./my.sh

awk '{print}' testfile
./my.sh testfile

cat testfile | awk '{print}'
cat testfile | ./my.sh

[ 本帖最后由 seeLnd 于 2007-10-17 17:58 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-10-17 18:27 |只看该作者

回复 #4 寂寞烈火 的帖子

烈火的理解基本上差不多了,
现在碰到的主要问题是偶的script是统计用的,除了文件名,后面还有一些可选参数,类似于如下形式:
my.sh  <filename>  [统计index | <统计index  统计基数>]
在不使用管道输出时候,“<>”的参数是必须的
似乎不能用 “-f” 判断文件是否存在的方法分支是否使用管道输入

貌似思路陷入死胡同,


TO 5楼的:没有理解偶的意思,最先就考虑这种方法了

[ 本帖最后由 ylgtang 于 2007-10-17 18:30 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2007-10-17 21:59 |只看该作者
原帖由 ylgtang 于 2007-10-17 18:27 发表
烈火的理解基本上差不多了,
现在碰到的主要问题是偶的script是统计用的,除了文件名,后面还有一些可选参数,类似于如下形式:
my.sh    [统计index | ]
在不使用管道输出时候,“”的参数是必须的
似乎不 ...

呵呵3,,,,似乎有很多难度, 与其这样不如结合现成的工具实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP