BASH:使用 echo | 为变量赋值sed |阅读

问题描述 投票:0回答:1

我试图将一根字符串穿过从

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
为变量赋值的唯一方法是使用
<<<

bash sed pipe echo
1个回答
0
投票

read
在管道末端运行在子进程中,然后立即退出。该变量与创建它的 shell 子进程一起消失。

你想要

oldIFS=$IFS
IFS='|'
read -r alpha beta gamma delta <<<"$STR"
IFS=$oldIFS

另请注意正确的 Bash 和 shell 脚本变量大写以及何时在 shell 变量周围加上引号?

© www.soinside.com 2019 - 2024. All rights reserved.