今天在处理文件时遇到个问题,当文件名包含空格时,for循环就出问题了:
[yangl@localhost BvsHS]$ ls APM.csv DP.csv Endo.csv 'IFE granular.csv' Immune.csv 'Inner infund.csv' Isthmus.csv Matirx.csv ORS.csv PR.csv vSMCs.csv Bulge.csv DS.csv 'IFE basal.csv' 'IFE spinous.csv' Infundibulum.csv IRS.csv Langerhans.csv Melanocytes.csv 'ORS SB.csv' Sebaceous.csv
如下,循环打印时空格分隔的一个文件名被当成了2个文件循环打印出来
[yangl@localhost BvsHS]$ for i in `ls`;do echo $i;done APM.csv Bulge.csv DP.csv DS.csv Endo.csv IFE basal.csv IFE granular.csv IFE spinous.csv Immune.csv Infundibulum.csv Inner infund.csv IRS.csv Isthmus.csv Langerhans.csv Matirx.csv Melanocytes.csv ORS.csv ORS SB.csv PR.csv Sebaceous.csv vSMCs.csv
要解决这个问题,就要从单词分隔符着手。而bash中使用的是$IFS(Internal Field Separator)这个变量,内容为” \n\t”
[yangl@localhost BvsHS]$ echo "$IFS" | od -t x1 0000000 20 09 0a 0a 0000004 [yangl@localhost BvsHS]$ echo "" | od -t x1 0000000 0a 0000001
备份原IFS,并修改IFS内容:
[yangl@localhost BvsHS]$ OLDIFS=$IFS [yangl@localhost BvsHS]$ IFS=$(echo -en "\n\b") #此时: [yangl@localhost BvsHS]$ echo "$IFS" | od -t x1 0000000 0a 08 0a 0000003
循环答应正常:
[yangl@localhost BvsHS]$ for i in `ls`;do echo $i;done APM.csv Bulge.csv DP.csv DS.csv Endo.csv IFE basal.csv IFE granular.csv IFE spinous.csv Immune.csv Infundibulum.csv Inner infund.csv IRS.csv Isthmus.csv Langerhans.csv Matirx.csv Melanocytes.csv ORS.csv ORS SB.csv PR.csv Sebaceous.csv vSMCs.csv
最后记得替换回原有的IFS:
[yangl@localhost BvsHS]$ IFS=$OLDIFS #或者 IFS=$(echo -en "\n\t") 【后面这个有点问题:0000000 0a 09 0a 0000003】 [yangl@localhost BvsHS]$ echo "$IFS" | od -t x1 0000000 0a 09 0a 0000004
参考:https://www.cnhackhy.com/15749.htm
尊重他人劳动成果,转载请注明出处:Bluesky's blog » shell循环打印带空格文件名