在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
然后什么也不打印。
答案 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