BASH中通过echo|sed|read管道为变量赋值失败的问题咨询
BASH中通过echo|sed|read管道为变量赋值失败的问题咨询
我最近在写Bash脚本时遇到了个棘手的问题:想把字符串通过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
可结果还是一样,变量依旧是空的。
直到我换成here-string的写法,脚本才终于正常工作:
read ALPHA BETA GAMMA DELTA <<< $(echo $STR | sed 's/\|/ /g')
后来我用shellcheck工具检查了一下最初的管道写法,它给出了这样的提示:
Modification of ALPHA is local (to subshell caused by pipeline)
这其实就是问题的根源:在Bash中,管道里的每个命令都会在独立的子shell中运行。read命令确实在子shell里给变量赋了值,但子shell执行结束后,这些变量就会被销毁,父shell根本无法访问到它们。
而here-string的写法不会创建子shell,read是在当前shell进程中执行的,所以赋值后的变量能被后续的命令正常读取和使用。
备注:内容来源于stack exchange,提问作者Akira Takeshi
相关产品推荐
相关产品推荐

