我想制作一个相当于zgrep
or 的脚本bzgrep
,但使用tar
.
我做了两次非常相似的尝试,我想知道是否有更好的尝试,是否可以改进,或者它们会因为某种我看不到的原因而崩溃。我知道如何使用tar
和bzip2
,但我经常在 shell 扩展方面遇到一些麻烦。
第一次使用$@
:
#!/bin/bash
FILE_IN="${@: -1}"; ## Take last arg (file name)
echo "FILE_IN: $FILE_IN";
INPUT_PARAMS="${@%%$FILE_IN}"; ## Take all args, but last (options and pattern)
echo "INPUT_PARAMS: $INPUT_PARAMS";
### Here I have to treat $INPUT_FILE before using grep (skipped) ###
grep "$INPUT_PARAMS" "$FILE_IN";
exit $?;
第二个使用变量(与上面几乎相同,只有一些区别):
#!/bin/bash
ARGS="$@"
FILE_IN="${!ARGS[@]: -1}"; ## Take last arg (file name)
INPUT_PARAMS=${ARGS%%$FILE_IN};
### From here is identical
它们似乎都有效,但后来我查看了脚本,bzgrep
发现它要复杂得多。所以,这让我觉得我的脚本行不通。
有什么想法吗?它们可以改进吗?
答案1
如果你想存储多个参数,你需要一个数组:
file_in="${@: -1}"
input_params=("${@:1:$#-1}")
或者:
file_in="${@: -1}"
input_params=("$@")
unset 'input_params[-1]'
或者,仅使用sh
语法:
n=$#
for file_in do
shift
[ "$((n = n - 1))" -gt 0 ] || break
set -- "$@" "$file_in"
done
# input_params in "$@"
(所有大写变量应保留给环境变量)。