AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 756401
Accepted
Kes
Kes
Asked: 2023-09-13 18:06:00 +0800 CST2023-09-13 18:06:00 +0800 CST 2023-09-13 18:06:00 +0800 CST

Como definir vários intervalos de páginas para pdftk com uma variável bash

  • 772

Estou usando Arch Linux, gerenciador de janelas Openbox e bash.
Tudo está atualizado com as versões mais recentes.

Alguém pode me dizer por que não consigo fazer com que a "$page_range"variável apareça pdftkquando especifico alguns intervalos de páginas como 3-5 7-9?

Quando especifico apenas um intervalo de páginas 3-5na minha caixa pop-up yad, tudo funciona como deveria.

pdftk permite que mais de um intervalo de páginas seja definido no comando. Na verdade, quando digito o comando na linha de comando sem usar variáveis ​​​​bash, o pdftk funciona conforme o esperado, considerando os intervalos de páginas 3-5 7-9. Só que não quando contenho esse valor dentro da variável "$page_range".

Tudo o que quero fazer é extrair os intervalos de páginas 3-5 e 7-9 do arquivo
/home/$USER/my_file.pdf
para outro arquivo pdf
usando a variável $page_rangepara definir meus intervalos.

Aqui está meu script simples.

#!/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
 
bash
  • 2 2 respostas
  • 50 Views

2 respostas

  • Voted
  1. Best Answer
    terdon
    2023-09-13T22:43:03+08:002023-09-13T22:43:03+08:00

    Isso está acontecendo porque você está fazendo a coisa certa, está citando suas variáveis. No entanto, como estão entre aspas, isso significa que os dois intervalos são passados ​​como uma única string pdftke espera duas ou mais strings separadas por espaços. Neste caso específico, onde você conhece e controla qual é o valor da variável, você pode conseguir escapar sem aspas. Mas não em todos os casos, e parece que você está pedindo informações aos usuários para que eles possam passar qualquer coisa para o script, tornando isso um risco de segurança, então a solução limpa é usar um array. Experimente isto:

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

    Você pode então passar isso como "${page_range[@]}"e ter os benefícios de citar suas variáveis ​​com segurança e a facilidade de uso de ter vários intervalos em uma variável.

    Portanto, as linhas relevantes no seu script tornam-se:

    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
    
    • 1
  2. Kes
    2023-09-13T19:20:37+08:002023-09-13T19:20:37+08:00

    A solução é não colocar aspas duplas na variável $page_range.
    Pelo menos faz o script funcionar funcionalmente.

    ou seja, faça isso, $page_range
    não isso"$page_range"

    Por alguma razão, o pdftk não gosta " "da expansão dessa variável específica.

    Eu estava supondo que pdftkestava comendo uma das aspas e não a outra naquela posição por causa de algum bug que causa falha. Mas isso não pode ser assim porque
    page_range="3-5"expande corretamente entre "$page_range"aspas duplas, sem espaço,
    mas
    page_range="3-5 7-9" não expande corretamente como "$page_range"aspas duplas

    Portanto, deve ter algo a ver com o espaço no meio dos intervalos de páginas durante as citações duplas e a maneira como isso é expandido ou a maneira como o pdftk o vê.

    Alguém tem alguma ideia?

    Mesmo que agora tudo esteja funcionando sem as aspas em torno $page_rangeda variável, isso é muito estranho.

    Porque normalmente aspas em torno da variável no bash são seguras. Estamos todos acostumados a fazer isso na eventualidade de um caminho e nome de arquivo que estamos processando conter espaços temidos!
    Portanto, é muito estranho que aspas duplas não resolvam os espaços e aspas não.
    Que estranho.

    Outro pensamento é que a expansão do espaço pode ser para um tipo específico de espaço, em um formato específico de codificação de caracteres que o pdftk não gosta.

    • 0

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve