如何使用 bash 变量为 pdftk 定义多个页面范围

如何使用 bash 变量为 pdftk 定义多个页面范围

我正在使用 Arch linux、Openbox 窗口管理器和 bash。
一切都是最新的最新版本。

谁能告诉我为什么当我指定几个页面范围时无法"$page_range"显示变量?pdftk3-5 7-9

3-5当我在 yad 弹出框中仅指定一个页面范围时,一切都会正常工作。

pdftk 确实允许在命令中定义多个页面范围。事实上,当我在命令行上键入命令而不在其中使用 bash 变量时, pdftk 按预期工作,获取页面范围3-5 7-9。只是当我在变量中包含这个值时就不会了"$page_range"

我想要做的就是 使用变量定义我的范围,将文件
/home/$USER/my_file.pdf中的页面范围 3-5 和 7-9 提取
到另一个 pdf 文件中。
$page_range

这是我的简单脚本。

#!/bin/bash

# collect the values with yad

extract_values=$(yad --form --width=200 \
--title="Enter the page ranges you wish to extract" \
--text="\n\n  Enter the page ranges you wish to extract\n    as eg 301-302\n    or 301-302 305-306\n     for grouping" \
--field="Page range":text "11-13 21-23" \
--button="Cancel!gtk-close":2 \
--button="Edit script":1 \
--button="Submit":0)



# strip out the values from the string
page_range=$(echo $extract_values | cut -d '|' -f  1)
echo $page_range



# produce a unique file extender 
page_range_slugify="$(echo "$page_range" | sed 's/ /_/g')" 
echo;echo $page_range_slugify
echo


# specify the filename
f=/home/$USER/my_file.pdf

# get path and file name without pdf extension
fz="${f%.*}"

# check everything is as it should be
yad --text="\n page range = $page_range\n page_range_slugify = $page_range_slugify\n file + path without file extension = $fz\n\n"

# below works only for one range but will not expand for two page ranges
pdftk "$f" cat "$page_range" output "$fz"_"$page_range_slugify".pdf

# below takes one range only as above 
#pdftk "$f" cat "$(printf %s "$page_range")" output "$fz"_"$page_range_slugify".pdf

# below takes both ranges when ranges are directly placed within the command
#pdftk "$f" cat 3-5 7-9 output "$fz"_"$page_range_slugify".pdf
 

答案1

发生这种情况是因为您正在做正确的事情,您正在引用变量。但是,因为它们被引号引起来,这意味着这两个范围作为单个字符串传递,pdftk并且需要两个或多个由空格分隔的字符串。在这种特定情况下,如果您知道并控制变量的值是什么,您可能无需引用即可逃脱。但并非在所有情况下,这看起来像是您要求用户输入,以便他们可以将任何内容传递给脚本,从而造成安全风险,因此干净的解决方案是使用数组。尝试这个:

page_range=( $(printf '%s\n' "$extract_values" | cut -d '|' -f  1) )

然后您可以将其传递为"${page_range[@]}"并获得安全引用变量的好处,变量中具有多个范围的易用性。

因此,脚本中的相关行变为:

page_range=( $(printf '%s\n' "$extract_values" | cut -d '|' -f  1) )

[ . . . ]
## With thanks to https://stackoverflow.com/a/9429887/1081936
page_range_slugify="$(IFS="_" ; printf '%s\n' "${page_range[*]}")" 

[ . . . ]
pdftk "$f" cat "${page_range[@]}" output "${fz}_$page_range_slugify".pdf

答案2

解决办法是不是双引号变量$page_range
至少它能让脚本正常运行。

即做这个$page_range
而不是这个"$page_range"

由于某种原因 pdftk 不喜欢" "扩展该特定变量。

我猜测这pdftk是在吃掉该位置的一个引号而不是另一个,因为某些错误导致它失败。但这不可能是因为双引号
page_range="3-5"正确扩展"$page_range"没有空格
但是
page_range="3-5 7-9" 才不是正确扩展为"$page_range"双引号

因此,这一定与双引号时页面范围中间的空格以及扩展方式或 pdftk 看待它的方式有关。

有人有什么想法吗?

即使现在一切都在变量周围没有引号的情况下工作, $page_range这也是非常奇怪的。

因为通常 bash 中变量两边的引号是安全的。我们都习惯这样做,以防我们正在处理的文件路径和名称包含可怕的空格!
因此,非常奇怪的是,双引号不处理空格,而引号不处理空格。
多么奇怪。

另一个想法是,空间扩展可能是针对特定类型的空间,采用 pdftk 不喜欢的特定字符编码格式。

相关内容