Нет, здесь строки недоступны для ksh88
и pdksh
. Однако в более позднихksh93
(оригинальных AT&T Korn Shell )иmksh
(в настоящее время активно разрабатываемых pdksh
производных )он доступен.
<<<
является одним из «современных» расширений оболочки, используемых ksh93
, mksh
, GNU bash
и zsh
.
Ваша конкретная проблема…
read A B C <<< $line
… можно обойти с помощью (оболочки Korn):
print -r -- $line |&
read -p A B C
Вы также можете использовать эту (оболочку POSIX ), она снижает производительность tmpfile, хотя (с другой стороны, <<<
, вероятно, также имеет):
read A B C <<EOF
$line
EOF
Если вы просто хотите разделить слова:
set -A arrname -- $line
Затем используйте ${arrname[0]}
вместо $A
и ${arrname[1]}
вместо $B
. Только он не остановится на разбиении на три элемента, так что если $line
равно "foo bar baz bla
", то $C
будет содержать "баз бла", тогда как ${arrname[2]}
содержит "баз", а ${arrname[3]}
содержит "бла".
Если вам не нужны позиционные параметры, вы можете
set -- $line
A=$1; shift
B=$1; shift
C=$*
shift
вызовет ошибки, если $line
содержит менее трех слов, хотя (проверьте $#
, если вы не уверены, или используйте [[ $line = *' '*' '[! ] ]]
(, вероятно, медленнее, хотя ), чтобы сначала проверить ).
Имейте в виду, что set … $line
также будет выполнять подстановку (спасибо Стефану за напоминание ), поэтому вам нужно set -o noglob
перед (и, возможно, после этого восстановить предыдущее состояние, обычноset +o noglob
).
Полное раскрытие :Я mksh
разработчик.