Are Here-Strings доступно в ksh88?

$ free | tail -n 1 | awk '{print $2}'
6
18.06.2018, 16:28
2 ответа

Нет, здесь строки недоступны для 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разработчик.

13
27.01.2020, 20:20

Нет, здесь -строки взяты из zshв версии 2.0 в 1991 году (и/или из Unix-порта rc, их соответствующие авторы примерно в то время обменивались идеями, неясно, кто из них имел идею или включил ее в свою оболочку первым ).

Был добавлен в bash в 2.05b (2002 ), ksh93 в m+ (2002 ), mksh в R33 (2008 ),яш в 2.7 (2009 ).

ksh88 не получает никаких новых функций.

Вот документы (<<), сами исходят из оболочки Борна -конца 70-х.

read A B Cсчитывает одну логическую строку в переменные A, Bи Cочень особым образом (немного менее специальным образом со значением по умолчанию $IFS, которое содержит только IFS -белые -символы пробела¹ ), с обратной косой чертой, действующей как экранирующий и символ продолжения строки -, и то, что входит в C, также довольно сложно. Проделать то же самое без readбыло бы довольно сложно.

Во всяком случае, здесь <<<— это то же самое, что и <<, только синтаксические отличия.

read A B C << EOF
$var
EOF

точно такое же, как

read A B C <<< "$var" # note that some versions of bash need the quotes

во всех оболочках. В обоих случаях оболочка создает удаленный временный файл с содержимым и дополнительной новой строкой (, хотя некоторые оболочки вместо этого используют каналы ). Затем readсчитывает из нее одну логическую строку (, возможно, несколько физических строк, продолженных обратной косой чертой ), и заполняет переменные, используя свои сложные правила.

Он назначает только первые 3 слова (SPC/TAB с разделителями )из $varна $A, $Bи $C, если

  • $IFSпо-прежнему содержит значение по умолчанию
  • переменная не содержит обратной косой черты и новой строки
  • переменная содержит только 3 слова.

Для первых трех слов вы можете:

function split_into {
  typeset words IFS v i=0
  set -o noglob

  set -A words -- $1; shift
  for v do
    eval "$v=\${words[i]}"
    ((i += 1))
  done
}

split_into "$var" A B C
  
  

¹ Пробельные символы IFS , согласно POSIX, это символы, классифицируемые как [:space:]в локали и находящиеся в $IFS, хотя в ksh88 (, на котором основана спецификация POSIX )и в большинстве оболочек это по-прежнему ограничено SPC, TAB и NL. Единственной совместимой с POSIX оболочкой, которую я нашел в этом отношении, была yash. ksh93иbash(начиная с версии 5.0 )также включают другие пробелы (, такие как CR,FF, VT... ), но ограничены одиночными -байтами (, будьте осторожны в некоторых системах, таких как Solaris, которые включают неразрывное -пространство -, которое в некоторых локалях является одним байтом)

8
27.01.2020, 20:20

Теги

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