我有以下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
即从管道输出中取出它。我怎样才能做到这一点?
答案 0 :(得分:5)
我通常会写:
export LC_ALL=C
head -n1 "$@" |
tr "\t" "\n" |
awk '{print $1 " " NR-1}'
这适用于任意数量的参数,如果没有则参数为none。在这个和许多其他环境中使用"$@"
很重要。有关控制shell参数处理方式的许多不同符号的详细信息,请参阅special parameters和shell parameter expansion上的Bash手册。通常,双引号是个好主意,特别是如果文件名可能包含空格。
答案 1 :(得分:2)
如果没有参数,常见的习惯用法是回退到输入文件-
。有一个方便的简写;
file=${1--}
替换${variable-fallback}
评估变量的值,或fallback
如果未设置。
我相信你的脚本应该按原样运行;如果您传入的(未引用的!)文件名计算为空字符串,则head
将读取标准输入。
顺便说一句,注意正确地双引号"$file"
的所有插值;否则,您的脚本将无法处理包含空格或shell元字符的文件名。 (然后,如果您的脚本没有收到文件名,那么您可以打破不将文件名传递给head
的幸运副作用。)