Perl 如何用脚本替换长的输入处理管道?

Perl 如何用脚本替换长的输入处理管道?,perl,bash,Perl,Bash,我有一个很长的shell命令,类似这样: cat file \ | perl -pe 's/...//g' \ | grep -v "hehe" \ | $HOME/scripts/foo.pl \ | sort | uniq -c 现在,我想将整个管道放入一个脚本script.sh,以便命令变成: cat file | ./script.sh 理想情况下,脚本也应该是可调用的,如下所示: ./script.sh file 但是我该怎么写剧本呢?对我来说,这似乎一点也不简单

我有一个很长的shell命令,类似这样:

cat file \
  | perl -pe 's/...//g' \
  | grep -v "hehe" \
  | $HOME/scripts/foo.pl \
  | sort | uniq -c
现在,我想将整个管道放入一个脚本
script.sh
,以便命令变成:

cat file | ./script.sh
理想情况下,脚本也应该是可调用的,如下所示:

./script.sh file
但是我该怎么写剧本呢?对我来说,这似乎一点也不简单。有什么建议吗?

script.sh的内容:

cat$1\
|perl-pe's/../g'\
|grep-v“呵呵”\
|$HOME/scripts/foo.pl\
|排序| uniq-c

然后将其作为
/script.sh文件运行

我们应该做到这一点


请注意引用第一个(也是唯一一个)命令行参数的
$1

将一些简单的shell与一些Perl DWIMery结合起来,您可以让脚本做正确的事情

#!/bin/bash
perl -pe 's/...//g' "$@" \
  | grep -v "hehe" \
  | $HOME/scripts/foo.pl \
  | sort | uniq -c

您可以将其作为
/script.sh文件
运行,它将读取
文件
,或者作为
grep foo文件|/script.sh
运行,它将从
STDIN
读取。在bash和其他一些shell中,$@
展开为引用参数列表,如果没有参数,则展开为空。当
perl
没有任何文件参数时,默认情况下它将从
STDIN

读取。好的,谢谢。只有
cat文件|./script.sh
无法工作,这很好。特别是因为我经常要做
头文件|./script.sh
。一个解决方法是
/script.sh。可能需要添加(A)一个shebang行,以及(b)一些关于没有提供命令行参数时发生的情况的解释(即
cat
没有参数,因此使用stdin)@Frank还可以通过
/script-
明确使用stdin,因为
cat
理解
-
的意思是“使用标准输入”。在风格方面,像
cat file |/script.sh
这样的表达式有时被称为a,因为您可以只编写
/script.sh
。(该页面上有一些类似的有用提示。)