shell脚本中IFS= read -r line的理解
IFS
是输入字段分隔符,这意味着读取的字符串将根据 IFS
中的字符进行分割。在命令行中, IFS
通常是指任何空白字符,这就是为什么命令行会在空格处分割的原因
执行类似 VAR=value command
的操作意味着 "修改命令的环境,使得 VAR
的值为 value
"。基本上,命令 command
会将 VAR
视为具有值 value
,但在此之后执行的任何命令仍然会将 VAR
视为其之前的值。换句话说,该变量将仅在那一行语句中被修改
所以当执行 IFS= read -r line
时,你实际上是将 IFS
设置为一个空字符串(不使用任何字符来分割,因此不会发生分割),这样 read
就会读取整行并将其视为一个单词,然后赋值给 line
变量。对 IFS
的修改只影响该语句,因此任何后续命令都不会受到该更改的影响。
将这个语句分成两部分来理解,第一部分清除 IFS 变量的值,即等同于更易读的 IFS=""
,第二部分是从标准输入 read -r line
读取 line
变量。
这种语法的特点在于,IFS 的赋值是暂时的,并且只对 read
命令有效。
-r
的作用是允许输入以 \
结尾时不被特殊处理,也就是说,反斜杠会被包含在 line
变量中,而不是作为续行字符,以允许多行输入
可以查看如下连接,上面解释的比较详细
参考:https://unix.stackexchange.com/questions/209123/understanding-ifs-read-r-line