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/