我试图将一根字符串穿过从
echo
到 sed
再到 read
的管道,但有些东西不起作用:
#!/bin/bash
STR="alef|bet|gimel|daled"
echo $STR
echo $STR | sed 's/\|/ /g' | read ALPHA BETA GAMMA DELTA
echo "ALPHA = $ALPHA"
echo "BETA = $BETA"
echo "GAMMA = $GAMMA"
echo "DELTA = $DELTA"
# alef|bet|gimel|daled
# ALPHA =
# BETA =
# GAMMA =
# DELTA =
如果在第三行,我使用以下语句,也会发生同样的事情:
echo $(echo $STR | sed 's/\|/ /g') | read ALPHA BETA GAMMA DELTA
仅当我在第三行使用以下语句时,脚本才会按您的预期工作:
read ALPHA BETA GAMMA DELTA <<< $(echo $STR | sed 's/\|/ /g')
当我使用第一个解决方案(使用两个管道)时,shellcheck.net 告诉我
ALPHA 的修改是本地的(由管道引起的子 shell)。
还有那个
ALPHA 在子 shell 中被修改。该更改可能会丢失。
这是否意味着
read
不能与管道一起使用,并且使用 read
为变量赋值的唯一方法是使用 <<<
?
read
在管道末端运行在子进程中,然后立即退出。该变量与创建它的 shell 子进程一起消失。
你想要
oldIFS=$IFS
IFS='|'
read -r alpha beta gamma delta <<<"$STR"
IFS=$oldIFS