Bash脚本中无需变量存储直接提取外部脚本输出最后单词的实现方法问询
不用变量存储直接提取外部脚本输出的最后一个单词
这个问题挺有意思的!你之前用变量存储再通过${STATUS##* }提取最后一个单词的方法完全没问题,不过既然好奇有没有跳过变量的实现方式,咱们来聊聊几种可行的方案,顺便解释下你之前尝试的写法为啥报错~
为什么echo ${$(~/bin/status)##* }会报错?
Bash的参数展开(就是${...}这种语法)不支持嵌套命令替换($(...)),所以你尝试的这种写法属于非法语法,自然会返回bad substitution错误。参数展开只能处理变量、数组这类已有数据,不能直接把命令输出塞进去做二次展开。
可行的替代方案
1. 用awk直接提取最后一个字段(最简洁)
awk的$NF变量天生就是用来表示最后一个字段的,不管输出里有多少个单词,都能直接拿到最后一个:
~/bin/status | awk '{print $NF}'
2. 用sed做字符串替换
通过正则匹配掉最后一个空格之前的所有内容,剩下的就是目标单词:
~/bin/status | sed 's/.* //'
这里的正则.* 会匹配从开头到最后一个空格的所有字符,替换为空后就只剩最后一个单词了。
3. 纯Bash内置实现(不依赖外部工具)
如果不想调用awk/sed这类外部工具,可以用read结合数组来处理:
# Bash 4.0及以上版本支持负索引 read -ra status_arr < <(~/bin/status); echo "${status_arr[-1]}" # 兼容老版本Bash的写法 read -ra status_arr < <(~/bin/status); echo "${status_arr[${#status_arr[@]}-1]}"
这里用进程替换< <(~/bin/status)把脚本的输出传给read命令,-ra选项会把输入按空格分割成数组status_arr,最后取数组的最后一个元素即可。
这些方法都能达到你想要的效果,不用先把输出存到变量里~
内容的提问来源于stack exchange,提问作者jokey
相关产品推荐
相关产品推荐

