
for file in /data/music/mp3
这个/data/music/mp3,根据展开得到一个文件名集合,forin循环是根据空格来取得集合中的每个元素(文件名)。若文件名本身就含有空格,的确会影响shell的解析。
另外,file本身属于shell命令,不适宜用作变量名,建议换一个变量名称。
换一种按行读取的循环方式:
ls /data/music/mp3 | while read myfiledo
#这里处理$myfile
done
改为:
/CliqueSearch2 -i "clique_$((i-1))_list100dat" -o "clique_${i}_list100dat" -s $i -w 100
$i -> ${i} ,这种写法更安全,前者在当前条件下产生了歧义,被解析成$i_list了,下面这段代码可以验证:
i_list=333i=4
echo "clique_$((i-1))_list100dat"
echo "clique_$i_list100dat"
echo "clique_${i}_list100dat"
echo "clique_${i_list}100dat"
两种方法实现:
脚本:
#!/bin/bash
for i in $(seq 30);
do
if [ $i -lt 10 ] ;then
mkdir '0'$i
cp '0'$i '0'$i/
else
mkdir $i
cp $i $i/
fi
done
mkdir 00
cp 00 00/
#end
C语言:
#include<stdioh>
int main()
{ char cmd[64];
int i;
for(i=0;i<30;i++){
sprintf(cmd,"mkdir %02d\n",i);
system(cmd);
}
for(i=0;i<30;i++){
sprintf(cmd,"cp %02d %02d/\n",i);
system(cmd);
}
return 0;
}
for循环在读入的时候是从一个大字符串中进行分割,而分割的标识是IFS,IFS默认分隔符是空格\tab\换行,所以会将换行符和空格同样对待,所以需要更改IFS的分割标志
解决方案:添加代码
OLDIFS=$IFS
IFS=$'\n'
IFS=$OLDIFS123
注意: 这里将IFS的分割标志换成了 $’\n’ 换行符,如果写成’\n’仅仅表示字母n 《Linux就该这么学》一起学习linux
结果: 每一次for循环能够得到正确的文件名,但是在执行mv命令时依然报错,原因是文件名中有空格,不能找到正确的文件
以上就是关于linux shell代码,如何选取所有的文件全部的内容,包括:linux shell代码,如何选取所有的文件、linux bash for循环、linux for 循环问题!!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)