那些年我们踩得那些shell坑(一)

0x1 环境介绍
 
  操作系统:red hat 6.8
 
  shell 类型:bash shell
 
0x2需求介绍
  
  循环输出目录下的".txt"文件(很简单吧。。。^^),那就边做边看吧。。。下面是目录下的文件
[root@localhost test]# ll

总用量 4

-rw-r--r--. 1 root root  0  8月 24 21:01 1- re.txt

-rw-r--r--. 1 root root  0  8月 24 21:01 2- re.txt

-rw-r--r--. 1 root root  0  8月 24 21:17 3.mp3

-rw-r--r--. 1 root root  0  8月 24 21:01 3- re.txt

-rw-r--r--. 1 root root  0  8月 24 21:17 4.mp3

-rwxr-xr-x. 1 root root 44  8月 24 21:09 for.sh

[root@localhost test]# 

0x3脚本开写, 如下;
 
#!/bin/bash
for i in `ls *.txt`;
do
echo $i
done

0x4运行结果,如下;
 
[root@localhost test]# ./for.sh 

1-

re.txt

2-

re.txt

3-

re.txt

 
这是什么鬼。。。跟自己想的完全不一样了
 
0x5坑位置
 
为什么会出现这样的问题呢? 因为for in 是根据空白符来分词的。。 是不是明白了?我们的文件名中间有空格,导致了这个问题
 
0x6 调整姿势
 
增加双引号,,改一下脚本,看看是否OK?
 
[root@localhost test]# cat for.sh 

#!/bin/bash

for i in "`ls *.txt`";

do

echo $i

done
 
测试结果

[root@localhost test]# ./for.sh 

1- re.txt 2- re.txt 3- re.txt    -----成了一个整体输出了,也不对
 
 
 
0x7 一起来
 
大家自己试试,,,稍后公布答案,,踊跃参加呀。。。。。
 
 0x8 答案揭晓 
 

#!/bin/bash
for i in *.txt;
do
echo $i
done
 
 

12 个评论

老师它不按套路出牌。。
[root@localhost Desktop]# ./1.sh
5.txt
6.txt
7.txt
8.txt
[root@localhost Desktop]# ./1.sh
5.txt 6.txt 7.txt 8.txt
第一次输出是有错误的shell=-=
第一次是正确的没问题啊
[root@localhost ll]# ./for.sh
1-re.txt
2-re.txt
3-re.txt
[root@localhost ll]# ./for.sh
1-re.txt 2-re.txt 3-re.txt
'><><'
文件名自带空格( ̄┰ ̄)
把你的代码贴出来
文件名是有空格的,,大黑阔。。
文件名加空格touch '1- re.txt'
#!/bin/bash
IFS=$'\n';
for i in `ls *.txt`;
do
echo $i
done
IFS=$'\n'; '\n' 不是一个变量,前面为什么要加取值符号$
这是isf的用法兄弟,规定的我也不能改变!
是ifs尴尬= =
不加$也可以实现阿 - -
#!/bin/bash
for i in *.txt;
do
echo $i
done

要回复文章请先登录注册