bash - 在 IFS 命令后读取时,奇怪的错误值对于基础来说太大了
问题描述
我有以下示例函数,它可以读取文件等。
function try_abc() {
abc_fn="file input.txt";
abc_0fn="file0.m"
abc_1fn="file1.m"
while read col1 col2 col3 col4 col5 col6 col7 col8; do
printf "%04X\n" "$((0x$col1))" >> $abc_0fn
printf "%04X\n" "$((0x$col2))" >> $abc_1fn
done < $abc_fn
}
如果我在 IFS 读取之前调用此函数,它可以正常工作,如下所示。
try_abc
default_line=$(head -n 1 $tf)
IFS=$'\n' brr=( $(xargs -n1 <<<"$default_line") )
如果我在 IFS 读取后调用相同的函数,则会失败并出现以下错误。
default_line=$(head -n 1 $tf)
IFS=$'\n' brr=( $(xargs -n1 <<<"$default_line") )
try_abc
打印的错误是..
00000ABC: value too great for base (error token is "00000ABC")
解决方案
分配后IFS
,新的 IFS 用作分配变量时的分隔符
read col1 col2 col3 col4 col5 col6 col7 col8
所以在读取文件时,空格不再被当作列分隔符,整行放入$col1
.
您应该保存 的旧值,IFS
以便恢复它。
saveIFS=$IFS
IFS=$'\n'
brr=( $(xargs -n1 <<<"$default_line") )
IFS=$saveIFS
您可能一直认为IFS
分配对于 assigns 的行来说只是临时的brr
。您可以将变量赋值放在普通命令之前,并且在命令执行时它们将是临时的。但是,如果该行的其余部分只是更多的变量分配,则不适用;这只是多个分配,它们永久适用于当前外壳。
推荐阅读
- python - 测试数据库在 Django Channels Pytest 测试期间不保留数据
- angular - 刷新几次后如何检查内部选项卡是否可用?
- jquery - 如何禁用CKeditor
来自修改的标记
- mysql - 从我的 PhpMyadmin SQL 选项卡运行以下查询
- angular - 2019 年访问 navigator.mediaDevices.getUserMedia() 的方式
- visual-studio - 恢复 Visual Studio 2019 更新
- php - Laravel 模型类的静态属性
- plotly - 如何从可编辑表中更新绘图/破折号?
- php - 如何在网页上实现基于角色的权限系统?
- javascript - 如何使用php在标头中发送带有参数的post请求