【发布时间】:2021-06-26 04:08:28
【问题描述】:
我正在尝试为 mpeepdf 自动化编写脚本。 我的脚本涉及读取文件夹,并运行 'for f in FILES' do... 循环从每个文件中提取 js,还生成 json 报告并将这些结果(js 文件和 json 报告)分别输出到单独的文件夹中。 我想要做的是读取没有扩展名的文件名(成功),并使用相同的文件名但具有不同的扩展名(如 .js 或 .json)将其输出到另一个文件夹。由于某种原因,JSON 报告生成成功,但是,由于提取 js 的命令略有不同,每个包含空格或 () 或任何其他字符的文件都无法处理得很惨。 我的代码 sn-p:
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 必须用引号引起来,否则命令 like 无法理解该命令。 -C 指定来自交互式 mpeepdf 模式的命令。
注意。我在 bash 脚本和 linux 方面没有经验,这是我第一次尝试(失败,失败......)。请善待。
【问题讨论】:
-
变量在双引号内展开,而不是在单引号内。这就是
"$f"起作用的原因。 -
您的文件名中是否包含单引号?当您将文件名替换为单引号字符串时,这将导致问题。
-
对不起 - -j 是我的打字错误。实际脚本中没有空格。编辑了原始帖子。
-
我的文件名包含空格和括号中的大部分数字,例如,report july (1).pdf 等。文件名中没有引号。
-
把
set -x放在脚本开头可以查看正在执行的命令。