bash変数を使用してpdftkに対して複数のページ範囲を定義する方法

bash変数を使用してpdftkに対して複数のページ範囲を定義する方法

私はArch Linux、Openboxウィンドウマネージャ、bashを使用しています。
すべてが最新の最新バージョンです。

複数のページ範囲を指定したときに変数が表示できない理由を伝える人はいますか"$page_range"pdftk3-5 7-9

3-5ヤードポップアップでページ範囲のみを指定すると、すべてがうまく機能します。

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

これは正しいことをしていて変数を参照しているために発生します。ただし、引用符で囲まれているため、2つの範囲が単一の文字列として渡され、pdftkスペースで区切られた2つ以上の文字列が必要であることを意味します。この特別なケースでは、変数の値が何であるかを知って制御すると、参照なしで外れる可能性があります。しかし、すべての場合に当てはまるわけではなく、ユーザーがスクリプトに何でも渡すことができるように入力を要求するように見えるため、セキュリティ上のリスクが発生するため、きちんとした解決策は配列を使用することです。この試み:

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

おすすめ記事