POSIX альтернатива множественным присваиваниям с чтением - PullRequest
0 голосов
/ 03 декабря 2018

В bash (работает по крайней мере v4) следующие команды позволяют назначать несколько переменных из строки:

IFS=',' read a b <<< "s1,s2"

IFS=',' read a b < <(echo "s1,s2") # an equivalent

После одной из этих команд:

$ echo $a
s1
$ echo $b
s2

Но предоставленные команды не POSIX-совместимы;если запустить в sh (dash):

sh: 1: Syntax error: redirection unexpected

Что такое POSIX-совместимая альтернатива этим командам?Я попытался:

IFS=',' echo "s1,s2" | read a b

Команда выполнена успешно (код возврата 0), но echo $a и echo $b затем ничего не печатает.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

В дополнение к ответу Гленна Джекмана, существует также опция явного именованного канала (который, по сути, заменяет замена процесса):

mkfifo p
echo "s1,s2" > p &
IFS=, read a b < p
0 голосов
/ 03 декабря 2018

a и b установлены , но из-за наличия линии, команда read выполняется в подоболочке.При выходе из подоболочки переменные исчезают.

Вы можете прочитать из этого документа

IFS=, read a b <<END
s1,s2
END

Чтобы заменить любой произвольный конвейер (или подстановку процесса), вы можете захватить выходные данные конвейера ипоместите эту переменную в heredoc:

output=$( seq 10 20 | paste -sd, )
IFS=, read a b <<END
$output
END
echo "$a"
echo "$b"

output

10
11,12,13,14,15,16,17,18,19,20
...