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

이는 올바른 일을 하고 있고 변수를 참조하고 있기 때문에 발생합니다. 그러나 따옴표로 묶여 있기 때문에 두 범위가 단일 문자열로 전달되며 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가 좋아하지 않는 특정 문자 인코딩 형식의 특정 유형의 공간에 대한 것일 수 있다는 것입니다.

관련 정보