首页 > 解决方案 > 在 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")

标签: bashshell

解决方案


分配后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。您可以将变量赋值放在普通命令之前,并且在命令执行时它们将是临时的。但是,如果该行的其余部分只是更多的变量分配,则不适用;这只是多个分配,它们永久适用于当前外壳。


推荐阅读