В следующей пустой строке используйте (правую фигурную скобку):
}
Использование предыдущей пустой строки (левая фигурная скобка):
{
Введите вышеуказанное в командном режиме
Ваш hashbang — /bin/sh
, и вы запускаете скрипт с sh
, который не поддерживает строку <<<
. Если вы используете /bin/bash
, это сработает.
Кроме того, несмотря на то, что /bin/sh
часто поддерживает массивы, это не обязательно, если требуется массив, вы должны использовать ksh
, bash
, zsh
или другую оболочку, которая их поддерживает.
<<<
— это оператор 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"
), иначе он подвергнется расщеплению (с последующим соединением с пробелом ).