Bash оболочка, которая сокращает строки - PullRequest
1 голос
/ 02 апреля 2020

У меня есть python программа , которая настраивает номер страницы PDF-файла.

Его использование примерно так:

usage: pagelabels [-h] [--outfile out.pdf] [--delete | --update]
                  [--startpage STARTPAGE]
                  [--type {arabic,roman lowercase,roman uppercase,letters lowercase,letters uppercase}]
                  [--prefix PREFIX] [--firstpagenum FIRSTPAGENUM]
                  [--load other.pdf]
                  file.pdf

Add page labels to a PDF file

Я написал скрипт оболочки-обертки, чтобы сэкономить при наборе текста при вызове pagelabels выше.

#!/bin/bash
# Wrapper for `addpagelabels.py`.

display_usage() {
    echo "Wrapper for addpagelabels.py"
    echo -e "\nUsage: <inputpdf> <startpage> <type> <firstpagenum>\n"
    echo -e "<type>:\n a=arabic;\n r=roman lowercase;\n R=roman uppercase;\n l=letters lowercase;\n L=letters uppercase.\n"
    echo "Output file would be filename_toc.pdf"
}

if [ $# -eq 0 ]; then
  display_usage
  exit 1

else

    a='arabic'
    r='roman lowercase'
    R='roman uppercase'
    l='letters lowercase'
    L='letters uppercase'

python3 -m pagelabels --startpage $2 --type $3 --firstpagenum $4 --outfile ${1%%.*}_toc.pdf $1
exit 0

fi

Строковые переменные, определенные в скрипте, не могут быть вызваны третьим аргументом a ниже.

$ bash pdfpgn.sh dtjl.pdf 2 a 297
usage: addpagelabels.py [-h] [--delete] [--startpage STARTPAGE]
                        [--type {arabic,roman lowercase,roman uppercase,letters lowercase,letters uppercase}]
                        [--prefix PREFIX] [--firstpagenum FIRSTPAGENUM]
                        [--outfile out.pdf]
                        file.pdf
addpagelabels.py: error: argument --type/-t: invalid choice: 'a' (choose from 'arabic', 'roman lowercase', 'roman uppercase', 'letters lowercase', 'letters uppercase')

Как правильно сделать это?


Следуя совету @Charles Duffy, я изменил свою функцию display_usage следующим образом:

display_usage() {
    echo "Wrapper for pagelabels.py (python3 -m pagelabels). "
    printf '%s\n' "Usage: pdfpgn.sh <inputpdf> <startpage> <type> <firstpagenum> <prefix>"
    echo
    printf '%s\n' "<type>:" " a=arabic" " r=roman lowercase" " R=roman uppercase" " l=letters lowercase" " L=letters uppercase"
    echo
    echo "Output file would be filename_pgn.pdf"
}

1 Ответ

1 голос
/ 02 апреля 2020

Рассмотрим ассоциативный массив (bash эквивалентно Python dict, хотя его ключи и значения могут быть только строками).

Рассмотрим:

#!/bin/bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Bash 4.0+ required" >&2; exit 1;; esac

declare -A type_abbreviations=(
    [a]='arabic'
    [r]='roman lowercase'
    [R]='roman uppercase'
    [l]='letters lowercase'
    [L]='letters uppercase'
)

filename=$1
startpage=$2
type=$3
startpagenum=$4

[[ ${type_abbreviations[$type]} ]] && type=${type_abbreviations[$type]}

exec python3 -m pagelabels \
  --startpage "$startpage" \
  --type "$type" \
  --firstpagenum "$startpagenum" \
  --outfile "${filename%%.*}_toc.pdf" \
  "$filename"
...