bash shell for循环的空格问题
时间:2019-11-20 08:52:59 来源:igfitidea点击:
在Linux shell脚本中,如何处理文件名中的空格?
当对有空格的文件名进行操作时,将会报错:
#!/bin/bash files=$(ls *.txt) dest="/backup" for f in $files do cp "$f" $dest done
在tmp目录下创建一个test目录
cd /tmp/ mkdir test cd test
创建一些文件
echo "test" > "This is a test.txt" echo ".net" > "file name with space.txt" date > "current date and time.txt" ls -l /etc/*.conf > "My configuration files.lst" echo "on It road" > quote.txt echo "Hello Java" > "Hello java.jar"
我们可以使用这些文件进行测试。
处理文件名带空格问题
在for或while循环中使用以下语法而不是ls命令,读取带空格的文件名:
语法
for f in * do echo "$f" done
使用bash for循环将文件复制到$dest目录:
#!/bin/bash dest="/backup" for f in *.txt do cp "$f" "$dest" done
将命令行参数$@(位置参数)用双引号引起来
您也可以传递命令行参数。
不过下面的代码并不好。
文件script
#!/bin/bash for f in $@ do echo "|$f|" done
安装下面的方法运行:
./script *.txt
*.txt的值将传递到$@。
最好把$@放到引号中。
所以应该像下面这样处理命令行的参数:
#!/bin/bash for f in "$@" do echo "|$f|" done
在while循环中处理空格
find . | while read -r file do echo "$file" done
或者
find . -type f -print0 | xargs -I {} -0 echo "|{}|"
或者
find . -type f -print0 | xargs -I {} -0 cp "{}" /path/to/dest/