我正在尝试通过创建tar ball来创建小实用程序来从远程主机收集日志文件,为简单起见,假设现在假设只显示基于用户输入的文件列表。
此命令正常
find $LOGS_DIR -maxdepth 1 -type f \( -name 'process1.log*' -o -name 'process2.log*' \) -exec echo 'FOUND_FILES:{}' ';'
如果我以编程方式想要根据用户输入更新-name子句,比如说用户输入是process3.log *,process4.log *,process5 * .log那么我的bash脚本应该生成find命令为
find $LOGS_DIR -maxdepth 1 -type f \( -name 'process3.log*' -o -name 'process4.log*' -o -name 'process5.log*' \) -exec echo 'FOUND_FILES:{}' ';'
这是我的代码段
...
for pattern in "${file_pattern_to_match[@]}"
do
if [ -z $final_pattern ];then
final_pattern="-name $pattern"
continue;
fi
final_pattern="$final_pattern -o -name $pattern"
done
#This will print final_pattern: -name process3.log* -o -name process4.log* -o -name process5.log*
echo "final_pattern:$final_pattern"
find $LOGS_DIR -maxdepth 1 -type f \( $final_pattern \) -exec echo "FOUND_FILES:{}" \;
但问题是执行脚本find时评估为
find /x/path/logs -maxdepth 1 -type f \( -name process3.log.1 process3.log.2 -o -name process4.log.1 process4.log.2 \) -exec echo "FOUND_FILES:{}" \;
但预期是
find /x/path/logs -maxdepth 1 -type f \( -name "process3.log.*" -o -name process4.log.* -o -name process5.log.* \) -exec echo "FOUND_FILES:{}" \;
因为变量被扩展了#34;发现"正在退出并出现错误
有人可以帮助我如何获得上述预期结果吗?
答案 0 :(得分:1)
使用数组来保持每个参数的正确引用。
first=
for pattern in "${file_pattern_to_match[@]}"
do
if [ -z "$first" ]; then
final_pattern=(-name "$pattern")
first=1
else
final_pattern+=(-o -name "$pattern")
fi
done
# Hacky
# first=
# for pattern in "${file_pattern_to_match[@]}"
# do
# final_pattern+=($first -name "$pattern")
# first=-o
# done
find "$LOGS_DIR" -maxdepth 1 -type f \( "${final_pattern[@]}" \) -exec echo "FOUND_FILES:{}" \;