Shell中如何将grep结果赋值给变量?问题分析与解决
哈哈,这个问题我当初刚学shell的时候也踩过坑!咱们来一步步拆解问题,再给你几个靠谱的解决办法~
问题出在哪?
你写的b="$a"|grep am其实踩了shell语法的两个小坑:
- 管道的子shell特性:shell会给管道的每一段命令单独开一个子shell运行。左边的
b="$a"是在子shell里完成的赋值,这个赋值只在那个子shell里有效,当前你用的父shell里的b根本没被修改,还是空的。 - 赋值命令没有输出:
b="$a"本身只是给变量赋值,不会向控制台输出任何内容,所以管道传给grep am的输入是空的,grep自然也没东西可输出。
而直接执行echo "$a"|grep am能正常工作,是因为echo会把字符串输出到管道里,grep能拿到输入并匹配到内容,自然就能输出结果啦。
正确的赋值方法
要把命令的输出捕获到变量里,得用命令替换($())——它会执行括号里的命令,把输出结果直接赋值给变量。这里有几种常用写法:
方法1:和你原逻辑一致的管道写法
a="i am a string " b=$(echo "$a" | grep am) echo "$b"
用$()把整个echo "$a" | grep am命令包起来,就能把命令的输出结果赋值给b了。
方法2:更高效的Here-String写法
不用额外启动echo进程,bash支持用<<<直接把变量内容传给grep当输入,更简洁高效:
a="i am a string " b=$(grep am <<< "$a") echo "$b"
方法3:只提取am这个单词(而非整行)
如果你确实只想要am这个词,而不是包含am的整行,记得给grep加-o参数(只输出匹配的部分):
a="i am a string " b=$(grep -o am <<< "$a") echo "$b"
这样输出就正好是你预期的am啦。
内容的提问来源于stack exchange,提问作者ZeroChow
相关产品推荐
相关产品推荐

