[РЕШЕНО] Можно ли удалить последний параметр?

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

MiK13
Сообщения: 1266
ОС: Linux Debian

[РЕШЕНО] Можно ли удалить последний параметр?

Сообщение MiK13 »

Здравствуйте!
Появилось желание печатать документы PDF в виде брошюры (свои без проблем печатаются в LibreOffice)
ChatGPT посоветовал команду pdfjam --booklet true input.pdf --outfile output.pdf
Я на её основе сделал скрипт:

Код: Выделить всё

#! /bin/bash

OF=$1
shift
pdfjam --booklet true --landscape --outfile $OF "$@"
(не знаю, нужно ли заключать $@ в кавычки)
Работает нормально, но нужно выходной файл указывать первым.
А хотелось бы последним. Извлечь его получилось через N=$#;OF=${!N}.
Теперь можно $OF подставить после --outfile
Но если использовать $@, то в него попадёт и имя выходного файла. А это не нужно.
Проблемы не было бы если использовать просто
pdfjam --booklet true --landscape --outfile $2 "$1"
Но дело в том, что после имени входного файла иногда надо указать диапазон страниц, из которых надо сделать брошюру. И тогда имя выходного файла оказывается 3-м параметром. Поэтому хочется найти способ вставить в командную строку все параметры за исключением последнего.
Можно ли это сделать?
Последний раз редактировалось MiK13 17.09.2024 00:47, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5413
ОС: Gentoo

Re: Можно ли удалить последний параметр?

Сообщение /dev/random »

Выражение "${@:1:$#-1}" подставит все параметры из $@, кроме последнего.
Спасибо сказали:
MiK13
Сообщения: 1266
ОС: Linux Debian

Re: Можно ли удалить последний параметр?

Сообщение MiK13 »

/dev/random писал:
16.09.2024 23:16
Выражение "${@:1:$#-1}" подставит все параметры из $@, кроме последнего.
Большое спасибо.
Не предполагал, что если вместо имени переменной поставить @, то счёт пойдёт параметрам
Заметил, что хотя ${V:0:-1} проходит, но ${@:1:-1} не проходит

Правда, в скрипте $PAR="${@:1:$#-1}" не прошло. Из-за того, что в имени файла были пробелы.
Но я сделал

Код: Выделить всё

IF="$1"
shift
$PAR="${@:1:$#-1}"
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5413
ОС: Gentoo

Re: Можно ли удалить последний параметр?

Сообщение /dev/random »

MiK13 писал:
17.09.2024 00:38
Правда, в скрипте $PAR="${@:1:$#-1}" не прошло. Из-за того, что в имени файла были пробелы.
Во-первых, не ставьте $ перед присваиванием. Но это, я думаю, вы опечатались только при наборе в форум, а в скрипте у вас без $.

Во-вторых, не присваивайте выборку из массива в строковую переменную. Как вы сами заметили, при этом теряется разница между пробелами внутри параметров и между параметрами. Вам нужно либо подставить это прямо в окончательную команду, либо сохранить в массив:

Shell

pdfjam всякая всячина "${@:1:$#-1}"
или

Shell

PAR=( "${@:1:$#-1}" )
pdfjam всякая всячина "${PAR[@]}"
Спасибо сказали:
MiK13
Сообщения: 1266
ОС: Linux Debian

Re: Можно ли удалить последний параметр?

Сообщение MiK13 »

Ещё раз спасибо.
/dev/random писал:
17.09.2024 09:41
MiK13 писал:
17.09.2024 00:38
Правда, в скрипте $PAR="${@:1:$#-1}" не прошло. Из-за того, что в имени файла были пробелы.
Во-первых, не ставьте $ перед присваиванием. Но это, я думаю, вы опечатались только при наборе в форум, а в скрипте у вас без $.
Даже сам не знаю, как он влез сюда. В скрипте его нет.
/dev/random писал:
17.09.2024 09:41
Во-вторых, не присваивайте выборку из массива в строковую переменную. Как вы сами заметили, при этом теряется разница между пробелами внутри параметров и между параметрами. Вам нужно либо подставить это прямо в окончательную команду, либо сохранить в массив:

Shell

pdfjam всякая всячина "${@:1:$#-1}"
или

Shell

PAR=( "${@:1:$#-1}" )
pdfjam всякая всячина "${PAR[@]}"
Я выбрал первый вариант.
Но возникла ещё одна проблема.
Я решил, что если задан только входной файл, то из его имени надо сформировать выходной, добавив к имени, например, "-br"
Я это сделал так:

Код: Выделить всё

if [[ $# = 1 ]] ; then
  OF=${1%.*}-br.pdf
  pdfjam --booklet true --landscape --outfile "$OF" "$1"
Но тут есть один момент.
А если я захочу превратить в брошюру только часть страниц? Например, командой BPDF file.pdf 1-16
Как сделать, что если я указал два параметра, но второй имеет вид N1-[N2], то есть два числа (или одно, после которого знак '-'), то скрипт всё равно решил бы, что выходной файл не указан, и сформировал его имя из первого параметра?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5413
ОС: Gentoo

Re: [РЕШЕНО] Можно ли удалить последний параметр?

Сообщение /dev/random »

MiK13 писал:
17.09.2024 12:45
Как сделать, что если я указал два параметра, но второй имеет вид N1-[N2], то есть два числа (или одно, после которого знак '-'), то скрипт всё равно решил бы, что выходной файл не указан, и сформировал его имя из первого параметра?

Shell

if [[ $# = 2 && $2 =~ ^[0-9]+-[0-9]*$ ]]
Спасибо сказали:
MiK13
Сообщения: 1266
ОС: Linux Debian

Re: [РЕШЕНО] Можно ли удалить последний параметр?

Сообщение MiK13 »

Ещё раз спасибо.
/dev/random писал:
17.09.2024 12:50
if [[ $# = 2 && $2 =~ ^[0-9]+-[0-9]*$ ]]
Я объединил эту проверку с проверкой на один параметр if [[ $# = 1 || $# = 2 && $2 =~ ^[0-9]+-[0-9]*$ ]]. Вроде проходит.
И попутно возник вопрос.
Если бы я писал эту проверку на C, то оба сравнения заключил бы в скобки. Тут же объединяющих скобок нет.
Можно ли их ставить для BASHа и является ли операция && более приоритетной, чем ||?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5413
ОС: Gentoo

Re: [РЕШЕНО] Можно ли удалить последний параметр?

Сообщение /dev/random »

MiK13 писал:
17.09.2024 13:15
Можно ли их ставить для BASHа и является ли операция && более приоритетной, чем ||?
Да на оба вопроса.
Спасибо сказали: