为何Bash脚本读取临时文件时出现‘not a valid identifier’错误?
Bash循环读取临时文件报错:
read: /tmp/xxx': not a valid identifier 问题重现
使用包含内联Python的Bash脚本读取JSON API,将输出写入临时文件后,确认文件存在且可通过head命令读取内容,但执行while read循环遍历文件行时,出现如下错误:
read: /tmp/temporary_tag_storage.H9hEH6': not a valid identifier
尝试给$tmpfile变量添加双引号后,问题仍未解决。
错误原因
核心问题是read命令的语法使用错误:
read命令的参数是用来存储读取内容的变量名,而非要读取的文件名。如果错误地将临时文件路径直接传给read(比如写成while read "$tmpfile"),Bash会把这个带特殊字符(斜杠、点)的文件路径当作变量名处理,但Bash变量名只能由字母、数字和下划线组成,且不能以数字开头,因此触发“not a valid identifier”错误。
解决方法
使用正确的while read循环语法,通过输入重定向将临时文件内容传入循环,而非把文件名传给read命令。推荐写法如下:
正确代码示例
# 假设已生成临时文件路径 tmpfile="/tmp/temporary_tag_storage.H9hEH6" # 正确的循环读取写法 while IFS= read -r line; do # 处理每一行内容,示例:打印行内容 echo "当前行:$line" done < "$tmpfile"
语法说明
IFS=:保留行首的空格和制表符,避免被截断-r:禁用反斜杠的转义功能,确保读取原始内容< "$tmpfile":将临时文件作为循环的输入源,而非把文件名传给read
替代写法(管道方式)
如果习惯用管道,也可以这样写(但重定向方式性能更优,避免子shell问题):
cat "$tmpfile" | while IFS= read -r line; do echo "当前行:$line" done
内容的提问来源于stack exchange,提问作者Mayor of the Plattenbaus
相关产品推荐
相关产品推荐

