我正在编写一个 bash 脚本,它将在多个文件中搜索。
我遇到的问题是我无法将不确定数量的变量作为参数传递给 bash 脚本
我希望它执行以下操作:
给定随机数量的参数。即:
./searchline.sh A B C
对第一个执行 grep,然后使用其余的执行 grep 结果:
grep "A" * | egrep B | egrep C
我尝试做的是用egreps构建一个字符串:
for j in "${@:2}";
do
ADDITIONALSEARCH="$ADDITIONALSEARCH | egrep $j";
done
grep "$1" * "$ADDITIONALSEARCH"
但不知怎的,这行不通,bash 似乎没有将“egrep”字符串视为egrep。
大家有什么建议吗?
顺便说一句,我无法创建任何辅助文件,因此我猜 grep -f 超出了范围。另请注意,传递给 bash 脚本的参数数量是可变的,因此我无法执行 egrep "$2" | egrep“$3”。
提前致谢。
费尔南多
您可以在这里使用递归来获取所需的管道数量:
#!/bin/bash
rec_egrep() {
if [ $# -eq 0 ]; then
exec cat
elif [ $# -eq 1 ]; then
exec egrep "$1"
else
local pat=$1
shift
egrep "$pat" | rec_egrep "$@"
fi
}
first_arg="$1"
shift
grep "$first_arg" * | rec_egrep "$@"
安全的
eval
可能是一个很好的解决方案:
#!/bin/bash
if [[ $# -gt 0 ]]; then
temp=(egrep -e "\"\$1\"" '*')
for (( i = 2; i <= $#; ++i )); do
temp+=('|' egrep -e "\"\$$i\"")
done
eval "${temp[@]}"
fi
运行它:
bash script.sh A B C