今天在處理文件時遇到個問題,當文件名包含空格時,for循環就出問題了。
例如,我在當前文件夾下建立3個文件名包含空格的文件:
 代碼如下:keakons-MacBook-Pro:test keakon$ touch "test 1"
keakons-MacBook-Pro:test keakon$ touch "test 2"
keakons-MacBook-Pro:test keakon$ touch "test 3"
keakons-MacBook-Pro:test keakon$ ls
test 1 test 2 test 3
然后for循環輸出文件名:
 代碼如下:keakons-MacBook-Pro:test keakon$ for file in `ls`;
> do echo $file;
> done
test
1
test
2
test
3
可以看到,文件名被分開了。
復制操作也不行:
 代碼如下:keakons-MacBook-Pro:test keakon$ mkdir ../bak
keakons-MacBook-Pro:test keakon$ for file in `ls`; do cp "$file" ../bak; done
cp: bak is a directory (not copied).
cp: test: No such file or directory
cp: 1: No such file or directory
cp: test: No such file or directory
cp: 2: No such file or directory
cp: test: No such file or directory
cp: 3: No such file or directory
要解決這個問題,當然就要從單詞分隔符著手。而bash中使用的是$IFS(Internal Field Separator)這個變量,內容為" /n/t":
 代碼如下:keakons-MacBook-Pro:test keakon$ echo $IFS
keakons-MacBook-Pro:test keakon$ echo "$IFS" | od -t x1
0000000    20  09  0a  0a                                                
0000004
keakons-MacBook-Pro:test keakon$ echo "" | od -t x1
0000000    0a                                                            
0000001
然后把它改成"/n/b",記得修改前先保存一下:
 代碼如下:keakons-MacBook-Pro:test keakon$ SAVEIFS=$IFS
keakons-MacBook-Pro:test keakon$ IFS=$(echo -en "/n/b")
現在再執行上述命令就正常了:
 代碼如下:keakons-MacBook-Pro:test keakon$ for file in `ls`; do echo $file; done
test 1
test 2
test 3
keakons-MacBook-Pro:test keakon$ for file in `ls`; do cp "$file" ../bak; done
keakons-MacBook-Pro:test keakon$ ls ../bak
test 1 test 2 test 3
最后,別忘了恢復$IFS:
 代碼如下:keakons-MacBook-Pro:test keakon$ IFS=$SAVEIFS
keakons-MacBook-Pro:test keakon$ echo "$IFS" | od -t x1
0000000    20  09  0a  0a                                                            
新聞熱點
疑難解答