POSIX替代了具有读取

时间:2018-12-03 15:33:56

标签: bash sh posix

bash(至少在v4上有效)中,以下命令允许从字符串分配多个变量:

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

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

使用以下命令之一后:

$ echo $a
s1
$ echo $b
s2

但是提供的命令不符合POSIX;如果在shdash)中运行:

sh: 1: Syntax error: redirection unexpected

这些命令的POSIX兼容替代品是什么?我试过了:

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

命令成功执行(返回代码0),但是echo $aecho $b然后什么也不打印。

2 个答案:

答案 0 :(得分:4)

已设置

def cfDecodeEmail(encodedString): r = int(encodedString[:2],16) email = ''.join([chr(int(encodedString[i:i+2], 16) ^ r) for i in range(2, len(encodedString), 2)]) return email a ,但是由于存在pipline,b命令在子shell中运行。当子外壳退出时,变量消失。

您可以阅读此处的文档

read

要替换任意管道(或进程替换),您可以捕获管道的输出并将该变量放入heredoc:

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

输出

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

答案 1 :(得分:3)

除了glenn jackman的回答外,还可以选择使用显式命名管道(本质上,这是进程替换所替换的管道):

mkfifo p
echo "s1,s2" > p &
IFS=, read a b < p