我想编写一个 bash 脚本,它可以处理类似于许多内置 bash 命令的参数和输入。比如像sort一样,它可以处理
sort -k 1 -r input.txt
sort input.txt -k 1 -r
cat input.txt | sort -k 1 -r
sort -k 1 -r < input.txt
sort -k 1 -r <(cat input.txt)
我希望我的脚本能够以类似的方式处理参数和输入
myscript.sh -i 3 -b 4 input.txt
myscript.sh input.txt -i 3 -b 4
cat input.txt | myscript.sh -i 3 -b 4
myscript.sh -i 3 -b 4 < input.txt
myscript.sh -i 3 -b 4 <(cat input.txt)
到目前为止,我只使用了“read”和“getopts”中的一些功能,并且认为如果我自己尝试这样做可能会出现问题。
为了让我更清楚地陈述我的问题,让 input.text 的内容为
aaa
bbb
ccc
我想使用参数 i 和 b 中的值来做一些事情,但我将在这个例子中打印出来。我想要的样本输出是
i : 3
b : 4
aaa
bbb
ccc
编写代码来处理上述示例命令以给出此输出的最佳方法是什么?
下面是从@chepner 的三明治思想中得到的代码,这是迄今为止最好的。
#!/bin/bash -l
die () {
echo >&2 "[exception] $@"
exit 1
}
#parse param
while getopts "i:b:" OPTION; do
case "$OPTION" in
i)
i="$OPTARG"
;;
b)
b="$OPTARG"
;;
*)
die "unrecognized option"
;;
esac
done
if [ -e tmpfile ]
then
rm tmpfile
fi
shift $(($OPTIND - 1))
echo "i : "$i
echo "b : "$b
cat $1 > tmpfile
if read -t 0; then
cat >> tmpfile
fi
cat tmpfile