【发布时间】:2011-04-19 02:28:32
【问题描述】:
我编写了一个简单的 bash 脚本,它从文件或 STDIN 中转储随机行:
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Syntax: $0 FILE (or \'-\' for STDIN)"
echo $0 - display a random line from FILE
exit 1
fi
RAND=`cat /proc/sys/kernel/random/uuid | cut -c1-4 | od -d | head -1 | cut -d' ' -f2`
if [ $1 != "-" ]
then
LINES=`cat "$1" | wc -l`
LINE=`expr $RAND % $LINES + 1`
head -$LINE $1 | tail -1
else
piped=`cat -`
LINES=`echo "$piped" | wc -l`
LINE=`expr $RAND % $LINES + 1`
echo "$piped" | head -$LINE | tail -1
fi
但是,如果没有传递任何选项,我希望它也处理 STDIN(但如果管道中没有 STDIN,仍然会在帮助下失败)。
也就是说,我想说:
echo "foo\nbar\nbaz" | randline
...而不是...
echo "foo\n\bar\nbaz" | randline -
如何做到这一点?
编辑:
感谢杜恩!
#!/bin/bash
if [ "$( tty )" == 'not a tty' ]
then
STDIN_DATA_PRESENT=1
else
STDIN_DATA_PRESENT=0
fi
if [[ $# -ne 1 && $STDIN_DATA_PRESENT -eq 0 ]]
then
echo "Syntax: $0 [FILE (or \'-\' for STDIN)]"
echo $0 - display a random line from FILE
echo -e "\nWill also process piped STDIN if no arguments are given."
exit 1
fi
RAND=`cat /proc/sys/kernel/random/uuid | cut -c1-4 | od -d | head -1 | cut -d' ' -f2`
if [[ $1 && $1 != "-" ]]
then
LINES=`cat "$1" | wc -l`
LINE=`expr $RAND % $LINES + 1`
head -$LINE $1 | tail -1
else
piped=`cat -`
LINES=`echo "$piped" | wc -l`
LINE=`expr $RAND % $LINES + 1`
echo "$piped" | head -$LINE | tail -1
fi
【问题讨论】:
-
见这里stackoverflow.com/questions/635361/ksh-how-to-probe-stdin 它是针对 ksh,但提供了针对 bash 的答案
-
您应该从您的问题中删除解决方案并将其添加为答案(如果它确实解决了您的问题,请接受它)。
标签: bash shell scripting pipe stdin