Footsteps on my way !
perl/linux/测序分析

shell循环打印带空格文件名

今天在处理文件时遇到个问题,当文件名包含空格时,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循环打印带空格文件名

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址