LINUX.ORG.RU

Количество элементов в строке

 


0

3

Пишу команду особых действий для файлового менеджера Thunar. Получаю в строковой переменной пути к файлам командой AAA=%N

Например при выделении трёх файлов с именами 1.jpg 2.jpg 3.jpg команда echo $AAA выдаст следующий результат.

'1.jpg' '2.jpg' '3.jpg'

Как получить количество элементов в строковой переменной? Повторяю, что мне нужно получить количество элементов, а не длину строки, т.е. количество выделенных файлов.

Сейчас решаю эту задачу циклом: for file in %F;do kolfile=$(($kolfile+1));done

Есть ли другое-правильно решение?

Ответ на: комментарий от i_gnatenko_brain

В имени файла может быть '

anonymous
()
Ответ на: комментарий от i_gnatenko_brain

Это решение для массива, а у меня строковая переменная. Можно с начало строку сделать массивом. AAA=(%F);echo ${#AAA[@]}

но thunar такую конструкцию не отрабатывает.

А для строковой переменной есть решение?

demonlibra
() автор топика

AAA=%N
echo $AAA выдаст следующий результат.
'1.jpg' '2.jpg' '3.jpg'

Протащенное через присвоение, раскрытие, вывод через echo — оно как-то не очень информативно.

Zmicier ★★★★★
()
Ответ на: комментарий от demonlibra

но thunar такую конструкцию не отрабатывает.

Если Тунар что-то не обрабатывает, то это к этому вашему Тунару. С точки зрения ГНУ Баша здесь все правильно. Может быть, правда, вы ошибаетесь и у вас там не Баш вызывается.

А для строковой переменной есть решение?

Что значит «для строковой переменной»?

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

AAA=«'1' '2' '3'» - строка AAA=('1' '2' '3') - массив

Ищу решение для строки. Есть ли решение без использования массивов?

demonlibra
() автор топика
Ответ на: комментарий от demonlibra

Ищу решение для строки.

Зачем?

Это решение для массива, а у меня строковая переменная.

У вас строковая переменная потому, что вы ее зачем-то создали. Зачем?

Можно с[]начал[а] строку сделать массивом.
AAA=(%F); echo ${#AAA[@]}

А вот здесь я не вижу никакой строки — вы сразу интерпретируете символьное представление вида '1.jpg' '2.jpg' '3.jpg' как массив — и это абсолютно верно.

Тем не менее, на будущее могу сообщить, что если у вас кусочек программы на Баше оказался записанным в строковую переменную, то переинтерпретировать его, разумеется, тоже можно. Есть такая конструкция — eval. Применительно к символьному представлению массива:

$ s="'foo' 'bar' 'baz quux'"
$ eval a=("$s")
$ printf '%s\n' "${a[@]}"
foo
bar
baz quux

Но здесь это очевидно излишне.

Есть ли решение без использования массивов?

Есть, конечно. Только вам оно зачем?

Если вы таки обнаружили, что у вас там какой-то неполноценный интерпретатор вместо ГНУ Баша, и Баш вы использовать не хотите, то уж по крайней мере единственный анонимный массив аргументов-то даже самая захудалая оболочка должна уметь:

$ set -- '1.jpg' '2.jpg' '3.jpg'
$ echo $#
3
Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 2)
Ответ на: комментарий от Zmicier

Спасибо. Последний вариант работает.

Вариант с созданием массива скорее всего не работает по причине особенностей синтаксиса написания скобок в thunar. Вот так работать не хочет AAA=(«%N») %N - это имена всех выделенных файлов Помучаюсь еще немного со скобками.

demonlibra
() автор топика

А ведь можно просто взять нормальный ЯП и не париться сексом вприсядку.

anonymous
()
Ответ на: комментарий от demonlibra

Спасибо.

Всегда пожалуйста.

Вариант с созданием массива скорее всего не работает по причине особенностей синтаксиса написания скобок в thunar.

То есть интерпретатор все-таки полноценный ГНУ Баш, вы убедились? Ну хорошо, а что до Тунара, то вам виднее — меня его нет.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от yars068

А в bash переменные не имеют типа.

Во-первых, неверно. А во-вторых, к чему здесь вообще это замечание?

Zmicier ★★★★★
()
Ответ на: комментарий от anonymous

А ведь можно просто взять нормальный ЯП и не париться сексом вприсядку.

Чушь какая-то. Об’яснитесь.

Zmicier ★★★★★
()

мне нужно получить количество элементов

а зачем, если не секрет? как это планируется использовать?

ananas ★★★★★
()
Ответ на: комментарий от ananas

В thunar есть такая функция - Особое действие. Это скрипты, которые исполняются для определенных форматов файлов или каталогов.

Например, выделяю несколько изображений, нажимаю правую кнопку мыши и выбираю скрипт (изменить разрешение или сжать или конвертировать или .... всё что угодно и для чего угодно). Я несколько таких написал для собственных нужд, примеры здесь: http://forum.ubuntu.ru/index.php?topic=222952.msg2203464#msg2203464

При обработке большого количества файлов в zenity делаю шкалу исполнения. Для этого необходимо знать количество выделенных файлов. Как уже писал в первом сообщении, сейчас этот подсчет делаю циклом for file in %F;do kolfile=$(($kolfile+1));done

demonlibra
() автор топика
Ответ на: комментарий от demonlibra

Я несколько таких написал для собственных нужд,

И избежал бы обсуждаемых выше проблем, если бы положил отдельный скрипт в ${HOME}/bin, оставив в настройках thunar его вызов с %N в качестве параметров.

ABW ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.