LINUX.ORG.RU

История изменений

Исправление Zmicier, (текущая версия) :

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

Зачем?

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

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

Можно с[]начал[а] строку сделать массивом.
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, :

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

Зачем?

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

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

Можно с[]начал[а] строку сделать массивом.
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, :

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

Зачем?

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

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

Можно с[]начал[а] строку сделать массивом.
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