grep结果无法存入变量:提取文件名日期存变量后输出为空
问题分析与解决
你的问题核心是误将文件名当作命令执行,而不是输出文件名的文本内容传递给grep,导致没有匹配结果存入变量。
错误原因拆解
在你的错误代码中:
result=$($filename |grep -Eo '[[:digit:]]{14}')
$filename会被解析为具体的文件名(比如OH/file20240520123456.txt),直接这样写相当于尝试执行这个文件名作为系统命令——但显然文件名不是可执行命令,所以这条管道命令没有输出,最终result变量就是空值。
修正后的代码
你需要用echo命令输出文件名,再通过管道传递给grep,同时建议给$filename加上双引号(避免文件名包含空格时出错):
for filename in OH/*; do result=$(echo "$filename" | grep -Eo '[[:digit:]]{14}') echo "$result" done
额外优化建议
如果想更高效(避免调用外部grep命令),可以用Bash内置的正则匹配功能:
for filename in OH/*; do if [[ "$filename" =~ ([0-9]{14}) ]]; then result="${BASH_REMATCH[1]}" echo "$result" fi done
这种方式完全依赖Bash内置功能,执行速度更快,也更灵活。
内容的提问来源于stack exchange,提问作者LaaKii
相关产品推荐
相关产品推荐

