如何将多管道处理后的speedtest-cli输出赋值给Shell变量
问题原因
你出现File name too long报错的核心是语法逻辑错误:speedDown=$( "$theTest" | grep "Download:" | sed 's/[^ ]* //' ) 行中,你直接将存储了speedtest-cli完整输出的$theTest放在管道前,Shell会把这整段输出内容当做一个可执行命令/文件名去查找运行,自然会因为文件名过长触发报错。
修复方案
方案1:保留原有缓存完整输出的逻辑
只需要在管道前加echo将变量内容输出到标准输入,再传递给后续过滤命令即可:
#!/bin/sh theTest=$(speedtest-cli) speedDown=$(echo "$theTest" | grep "Download:" | sed 's/[^ ]* //')
方案2:更简洁的直接赋值写法(无需额外缓存完整输出)
直接将speedtest-cli的输出通过管道传递给过滤命令,一步拿到结果赋值给变量,内存占用更低:
#!/bin/sh speedDown=$(speedtest-cli | grep "Download:" | sed 's/[^ ]* //')
优化写法:合并过滤逻辑减少进程调用
可以只用sed一步完成匹配+替换,省略grep命令:
speedDown=$(speedtest-cli | sed -n 's/^Download: //p')
该命令含义为:
-n关闭sed默认输出所有行的逻辑- 匹配以
Download:开头的行,删除开头的Download:前缀 p指令将处理后的匹配行输出
内容的提问来源于stack exchange,提问作者pastic
相关产品推荐
相关产品推荐

