Shell - 空格的处理

日期 2018-10-07
Coding/编程
作者 Webster Zhang

前言

前几天做Weekly test的时候碰到了一道题目,大意要求是给两个目录,找出两个目录中相同的文件。最后一个样例数据给的是一个文件名带空格的目录,直接翻车。

For循环所有文件名

for file in *
do
    # Do something
done

这个循环如果不加任何处理碰上空格文件名直接就会GG,因为空格的前后的内容会被当成是两个东西然后被分别执行导致错误。

解决方案 - IFS

后来上网查了查,最多人使用的方法是设置IFS - Internal Field Separator。

The internal field separator (abbreviated IFS) refers to a variable which defines the character or characters used to separate a pattern into tokens for some operations.

基本上,我将IFS理解成Shell用于分隔参数的分隔符,其默认值是空格。在实际使用时,先使用一个变量,例如old_ifs把原来的IFS先保存起来,然后将IFS改成其他的东西,例如"\n"符号。这样一来,在传入参数时只需要写成ls -1就可以得到以\n分隔的文件列表了。处理完成以后再将IFS改回即可。

# save and change IFS
old_ifs=$IFS
IFS=$'\n'

# Do something

# restore it
IFS=$old_ifs

参考