История изменений
Исправление 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