使bash脚本接受来自文件或管道输出的输入

时间:2014-04-02 04:34:54

标签: linux bash unix pipe

我有以下bash脚本,它将表格数据作为输入, 得到第一行并垂直吐出它们:

#!/bin/bash  
# my_script.sh
export LC_ALL=C
file=$1
head -n1  $file |
tr "\t" "\n" |
awk '{print $1 " " NR-1}'

问题是我只能这样执行:

$ myscript.sh some_tab_file.txt 

我想要做的是在上述功能之上还允许你这样做:

$ cat some_tab_file.txt myscript.sh | myscript.sh 

即从管道输出中取出它。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:5)

我通常会写:

export LC_ALL=C
head -n1 "$@" |
tr "\t" "\n" |
awk '{print $1 " " NR-1}'

这适用于任意数量的参数,如果没有则参数为none。在这个和许多其他环境中使用"$@"很重要。有关控制shell参数处理方式的许多不同符号的详细信息,请参阅special parametersshell parameter expansion上的Bash手册。通常,双引号是个好主意,特别是如果文件名可能包含空格。

答案 1 :(得分:2)

如果没有参数,常见的习惯用法是回退到输入文件-。有一个方便的简写;

file=${1--}

替换${variable-fallback}评估变量的值,或fallback如果未设置。

我相信你的脚本应该按原样运行;如果您传入的(未引用的!)文件名计算为空字符串,则head将读取标准输入。

顺便说一句,注意正确地双引号"$file"的所有插值;否则,您的脚本将无法处理包含空格或shell元字符的文件名。 (然后,如果您的脚本没有收到文件名,那么您可以打破不将文件名传递给head的幸运副作用。)