POSIX 使用 read 替代多变量赋值
POSIX alternative to multiple variables assignments with read
在 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
命令成功(return 代码 0
),但是 echo $a
和 echo $b
然后什么都不打印。
a
和 b
已设置 ,但由于管道,read
命令在子 shell 中运行。当子shell退出时,变量消失。
您可以阅读此处的文档
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"
产出
10
11,12,13,14,15,16,17,18,19,20
除了 glenn jackman 的回答之外,还有一个显式命名管道的选项(本质上是进程替换所替换的内容):
mkfifo p
echo "s1,s2" > p &
IFS=, read a b < p
在 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
命令成功(return 代码 0
),但是 echo $a
和 echo $b
然后什么都不打印。
a
和 b
已设置 ,但由于管道,read
命令在子 shell 中运行。当子shell退出时,变量消失。
您可以阅读此处的文档
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"
产出
10
11,12,13,14,15,16,17,18,19,20
除了 glenn jackman 的回答之外,还有一个显式命名管道的选项(本质上是进程替换所替换的内容):
mkfifo p
echo "s1,s2" > p &
IFS=, read a b < p