输出到名称包含特殊字符的文件(bash脚本linux)

Output to file whose name contains special characters (bash script linux)

我正在尝试为 mpeepdf 自动化编写脚本。 我的脚本涉及读取文件夹,运行 'for f in FILES' 做...从每个文件中提取 js 的循环,还生成 json 报告并输出这些结果(js 文件和 json 报告)分别在单独的文件夹中。 我想要做的是读取没有扩展名的文件名(成功),并使用相同的文件名但具有不同的扩展名(例如 .js 或 .json)将其输出到另一个文件夹。由于某种原因,JSON 报告生成成功,但是,由于提取 js 的命令略有不同,每个包含空格或 () 或任何其他字符的文件都无法顺利处理。 我的代码片段:

for f in FILES
do
filename="$(basename "$f")"
reportname="${filename%%.*}.json"
jsoutput="${filename%%.*}.js"
REPORTOUTPUT=/home/parallels/randomfolder/reports/"$reportname"
JSOUTPUT=/home/parallels/randomfolder/extract-js/"$jsoutput"
mpeepdf -flm "$f" -j "$REPORTOUTPUT"
mpeepdf -flm "$f" -C "extract js > '$JSOUTPUT'" /// the problematic part is here. i know this is wrong > explanation below...
done

所以我认为有问题的部分主要与引号有关。要成功读取文件并正确指定报告输出,命令应如下所示:(手动测试并完美运行)

mpeepdf -flm 'file name with spaces and symbols.pdf' -C "extract js > 'file name with spaces and quotes.js'"

我很困惑,因为将 "$f" 放在单引号中不会读取文件名(因为里面的所有内容都被读取为一个字符串而不解释符号)。然而,这似乎不是问题,因为在生成 json 报告时读取和输出文件名的方式是可以的。问题出在 extract js 命令上。请注意 extract js > path 必须用引号括起来,否则类似的命令无法理解该命令。 -C 指定来自交互式 mpeepdf 模式的命令。

注意。我不是 bash 脚本和 linux 方面的经验,这是我第一次尝试(失败,失败...)。请善待

也许你应该先构造你的命令字符串,然后使用 eval 来执行它,如下所示:

cmd_str='mpeepdf -flm '"'""$f""'"' -C "extract js > '"'""$JSOUTPUT""'"'"'
eval $cmd_str

看起来对我有用。