оболочка: преобразовать строку в массив

В следующей пустой строке используйте (правую фигурную скобку):

}

Использование предыдущей пустой строки (левая фигурная скобка):

{

Введите вышеуказанное в командном режиме

4
24.02.2020, 21:50
2 ответа

Ваш hashbang — /bin/sh, и вы запускаете скрипт с sh, который не поддерживает строку <<<. Если вы используете /bin/bash, это сработает.

Кроме того, несмотря на то, что /bin/shчасто поддерживает массивы, это не обязательно, если требуется массив, вы должны использовать ksh, bash, zshили другую оболочку, которая их поддерживает.

3
28.04.2021, 23:22

<<<— это оператор zsh, который теперь поддерживается несколькими другими оболочками (, включаяbash).

read -aспецифичен для bash -. ksh имел read -Aдля этого задолго до bash (в соответствии с set -A; set -aявляется чем-то еще, унаследованным от оболочки Борна; также поддерживается zshиyash)

shв наши дни является реализацией или другой интерпретатор для языка POSIX sh. В этом языке нет ни <<<, ни read -a, ни массивов (, кроме"$@").

В Ubuntu по умолчанию в качестве интерпретатора shиспользуется оболочка dash, которая очень близка к спецификации POSIX shв том смысле, что реализует очень мало расширений по сравнению с тем, что указано в POSIX. Он не реализует ни <<<, read -a, ни массивы.

В POSIX shдля разделения строки на один массив POSIX sh("$@")следует использовать:

IFS=.             # split on.
set -o noglob     # disable glob
set -- $VERSION"" # split+glob with glob disabled.
echo "$# elements:"
printf ' - "%s"\n' "$@"

У него есть несколько преимуществ по сравнению с синтаксисом, -специфичным для bash IFS=. read -a <<< $string:

  • нет необходимости создавать временный файл и хранить в нем содержимое $string.
  • это работает, даже если $stringсодержит символы новой строки(read -a <<< $string)будет читать только первую строку.
  • это работает, даже если $stringсодержит символы обратной косой черты (с read, вам нужна опция -r, чтобы обратная косая черта не подвергалась специальной обработке ).
  • это стандарт.
  • работает для таких значений, как 1.2.. read -a <<< $stringразделил бы его на "1"и "2"только вместо "1", "2"и "".
  • в старых версиях bash,вы должны были указать $string(IFS=. read -ra <<< "$string"), иначе он подвергнется расщеплению (с последующим соединением с пробелом ).
5
28.04.2021, 23:22

Теги

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