Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: bash: как отрезать N аргументов  (Прочитано 951 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Malamut

  • Автор темы
  • Ubuntu Member
  • Администратор
  • Старожил
  • *
  • Сообщений: 3337
  • Я добрый, честно!
    • Просмотр профиля
    • Моя страница на Launchpad
bash: как отрезать N аргументов
« : 25 Февраля 2014, 13:20:15 »
Проблема такая - мне нужно написать скрипт-обёртку, добавляющую некоторые опции к tar. Скрипт этот должен иметь возможность работать с путями, содержащими пробелы. Логика работы у него такая - из всех аргументов отрезаются несколько первых, остальные передаются tar.

В чём, собственно, проблема. Допустим есть такой скрипт:

#!/bin/bash

tar "$@"

у него всё прекрасно, tar получает именно то, что нужно. Но мне надо от $@ кой-чего отрезать. Не проблема:

#!/bin/bash

TAR_OPTS=${@: -5}

tar "$TAR_OPTS"

Однако облом - в этом случае у tar будет всего один параметр - огромная строка из опций, как будто его вызвали как tar "-cvjf ..."

Даже так не работает:

#!/bin/bash

TAR_OPTS=$@

tar "$TAR_OPTS"

Хотя, казалось бы, от первого варианта не отличается абсолютно ничем! Игра с кавычками не даёт никаких значимых результатов.

Вопрос, собственно, в том, как правильно сделать операцию по типу ${@: -5} так, чтобы результат всё ещё представлял из себя не одну строку, а набор строк-аргументов, каждая из которых может быть с пробелами?
"Носителем суверенитета и единственным источником власти в Российской Федерации является ее многонациональный народ" Конституция РФ

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: bash: как отрезать N аргументов
« Ответ #1 : 25 Февраля 2014, 14:30:40 »
shift пять раз?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: bash: как отрезать N аргументов
« Ответ #2 : 25 Февраля 2014, 16:40:48 »
Пример из моей практики, чтобы понять идею.
В наутилусе были выбраны какие-то svg файлы и запущен сценарий конвертирования выбранных svg в png.
#!/bin/sh
# Конвертирование выбранные svg файлы в png

while [ $# -ne 0 ]
do
inkscape $1 --export-dpi=200 --export-png=$1.png
shift
done
« Последнее редактирование: 25 Февраля 2014, 16:44:44 от alexander.pronin »

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3269
    • Просмотр профиля
Re: bash: как отрезать N аргументов
« Ответ #3 : 25 Февраля 2014, 17:35:13 »
Попробуйте через присвоение.
Пусть скрипт вызывается с четырьмя или более параметрами и в нём есть строки:
declare -a arr=("${@:2}")
echo "dim="${#arr[@]} "ind="${arr[2]} "all: "${arr[@]}
Это для примера, с параметрами, содержащие пробелы, я не проверял.
Пётр.

Оффлайн golota

  • Участник
  • *
  • Сообщений: 132
    • Просмотр профиля
Re: bash: как отрезать N аргументов
« Ответ #4 : 25 Февраля 2014, 21:13:35 »
bash могуч, в нём как и в си, есть счётчик аргументов и массив аргументов (только нумерация задом на перёд)
без shift-ов, всё легко и просто ... и getopt не сильно нужен ...
Если аргумент с пробелами "закавычен", будет всё ОК!
Что и как делать, надеюсь понятно  :coolsmiley:
 
(Нажмите, чтобы показать/скрыть)

Затибидохался уже ... spoiler, code, сохранил, смотриш, один раз нормально, потом опять код ломает с квадратными скобками проблема. Короче, надеюсь разберётесь в системе.
« Последнее редактирование: 26 Февраля 2014, 01:55:31 от golota »
Я знаю то, что ничего не знаю, но некоторые не знают и этого. Сократ

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: bash: как отрезать N аргументов
« Ответ #5 : 26 Февраля 2014, 18:09:44 »
#!/bin/bash

TAR_OPTS=${@: -5}

tar "$TAR_OPTS"

Однако облом - в этом случае у tar будет всего один параметр - огромная строка из опций, как будто его вызвали как tar "-cvjf ..."

Даже так не работает
А так работает:
Код: (bash) [Выделить]
#!/bin/bash

TAR_OPTS=`echo "${@: -5}" | xargs `

tar "$TAR_OPTS"
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.018 секунд. Запросов: 22.