Сценарий Bash: как использовать двузначные цифры, как в «p10 = $ 10», или указать ВСЕ (для скрипта с файловым роликом)

I ' m new и присоединился, чтобы задать вопрос о скрипте (первый ответ на Как отключить диалоговое окно «Извлечение успешно завершено» в Nautilus? ) и не смог «комментировать» под ним (без репутации) и опубликовать его через Ответ казался неправильным.

Итак, вопрос заключается в использовании двузначных цифр или, что еще лучше, в указании ВСЕ в сценарии, например, следующего:

#!/bin/bash
p1=$1
p2=$2
p3=$3
p4=$4
p5=$5
p6=$6
if [[ $p2 == *"notify"* ]]; then
        p2=""
fi
/usr/bin/file-roller_orig $p1 $p2 $p3 $p4 $p5 $p6

Сценарий предназначен для отключения всплывающего окна успешного извлечения с помощью File Roller параметр контекстного меню в Nautilus, и он успешно это делает. Однако он ограничен извлечением до 4 архивов одновременно. Поскольку я часто извлекаю дюжину или более файлов одновременно, Увидев, что p2 = $ 2 был привязан к уведомлению, я экспериментировал с добавлением p7 = $ 7 и т. д. (я не гуру CLI), и он действительно извлек более 4, но после p9 = $ 9 (извлекает 7 архивов), он остановился на этом - что, как я думал, могло произойти, поскольку в Gedit последняя цифра в конце p10 = 10 $ и т. Д. Была другого цвета, чем остальное (я подумал, что это нехорошо).

Итак, как мне сделать записи после p9 = $ 9 или, что еще лучше, заставить скрипт сообщать файлу-ролик для распаковать все архивы, которые были выбраны ? Последний вариант был бы идеальным, так как даже если я могу заставить его извлекать дюжину файлов одновременно, я обязательно захочу извлечь больше, чем это, в какой-то момент, и мне не придется делать это партиями. Заранее большое спасибо за ваши ответы. Ура.

1
задан 10 December 2020 в 05:03

2 ответа

Вы можете использовать «$ @» для получения всех параметров и сдвиг N для удаления N аргументов.

#!/bin/bash
p1="$1"
p2="$2"
shift 2
if [[ $p2 == *"notify"* ]]; then
        p2=""
fi
/usr/bin/file-roller_orig $p1 $p2 "$@"

Заключение переменных в двойные кавычки ( например "$ 1" ) - хорошая идея, чтобы гарантировать, что bash не пытается использовать одну переменную в качестве нескольких аргументов.

Хотя использование $ @ лучше, можно используйте $ {10} для доступа к десятому аргументу.

2
ответ дан 3 January 2021 в 22:47

ИМХО такой подход ошибочен по нескольким причинам.

Что наиболее важно, он полагается на - notify , заданный как второй позиционный параметр команды. Хотя это может иметь место при вызове из действия nautilus, нет никакой гарантии, что оно останется таковым (и, конечно, не может быть гарантировано, если файл-ролик запускается в других контекстах).

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

Что я бы предложил вместо этого

#!/bin/bash

declare -a args

for arg do
  case $arg in
    "--notify") continue
    ;;
    *) args+=("$arg")
    ;;
  esac
done

/usr/bin/file-roller "${args[@]}"

Сохранить где-нибудь раньше на вашем ПУТИ , чем исходный / usr / bin / file-Roller - например, / usr / local / bin / file-Roller (для отмены поведения по умолчанию для всей системы) или ~ / bin / file-Roller (для отмены только для вашего пользователя).

1
ответ дан 3 January 2021 в 22:47

Другие вопросы по тегам:

Похожие вопросы: