我在一个包含\ n
的bash脚本中遇到问题并发出构建查找命令的问题这是我要构建的命令
find ./201911 -printf "%f\n">201911filelist.txt
当我在命令行上测试时,一切看起来还不错,但是当我将其放在脚本中时,回显会将\ n视为新行。我已经尝试过转义,但没有用
# echo "find ./$dir -printf \"%f""\n"\"">${dir}filelist.txt"""
find ./201911 -printf "%f\n">201911filelist.txt
在我的脚本中,它看起来像这样
echo "find ./$dir -printf \"%f""\n"\"">${dir}filelist.txt""" >> create_script_$dir.sh
文件中的结果是这样的:
find ./201909 -printf "%f
">201909filelist.txt
如果也尝试过
/bin/echo -e "find ./$dir -printf \""%f\\" "n\""> ${dir}201911filelist.txt"
以下结果,但我需要摆脱空间:
find ./201911 -printf "%f\ n"> 201911201911filelist.txt
我在这里丢失了一些东西,但是我真的很接近...
答案 0 :(得分:1)
首先-bash中的代码生成仅适用于专家,并且存在严重的安全风险。考虑寻找其他方式来满足您的需求。
话虽如此,以下行为符合预期:
#!/usr/bin/env bash
checkShellCompat() {
[ -n "$BASH_VERSION" ] && return
echo "ERROR: Must run this script with bash, not sh" >&2
exit 1
}
buildFindCmds() {
# generate a correct shebang, and run the shell compatibility check
printf '%s\n' '#!/usr/bin/env bash' "$(declare -f checkShellCompat)" checkShellCompat
# ...then, for each directory, generate a find command with a correct redirection
for dir; do
printf '%q ' find "./$dir" -printf '%f\n'
printf '>%q\n' "${dir}filelist.txt"
done
}
buildFindCmds 201911 201912
答案 1 :(得分:-1)
如果要记录特定命令,可以使用bash'set -x','set + x'。
set -x
find ./201911 -printf "%f\n">201911filelist.txt
.. additional command
set +x
或将其包装到函数中
function log_and_run {
echo "$1" >&2
eval "$1"
}
log_and_run 'find ./201911 -printf "%f\n">201911filelist.txt'
根据评论,重要的是要强调指出,由于与评估的各种扩展相关联的潜在风险,不应将此log_and_run用作通用日志记录框架-请参阅下面的评论。