如何在Bash脚本中使用双引号处理文件名中的空格

3
我们在Debian服务器上运行一个脚本,它获取目录中的文件名并将它们推送到我们的API。当文件名没有空格时,它可以正常运行。通常解决这个常见问题的方法是在变量名周围使用双引号。然而,针对我们的特定情况,我找不到一个整洁、简短和明确的解决方案——如下所示代码。虽然这个答案建议将分隔符从空格更改为\n,但我宁愿在我们现有的代码中正确使用双引号方法。
以下是代码的相关部分:
files=("$(ls $directory)") #$directory has the files we want to loop through

if [ ${#files[@]} -gt 0 ]; then
    getToken
    for i in $files
    do
        echo "$i"
        uploadFiles "$i"
    done
    exit
else
    echo "No files to upload"
    exit
fi

3
简明版:不要解析 ls。翻译:不要对 ls 命令进行解析。 - gniourf_gniourf
1个回答

3

为了处理文件名中包含空格的情况,请按照以下方式编写脚本:

shopt -s nullglob
files=("$directory"/*)

for i in "${files[@]}"
do  
  echo "$i"
  uploadFiles "$i"
done

如果你不需要保留数组,你可以这样做:

shopt -s nullglob

for i in "$directory"/*
do  
  echo "$i"
  uploadFiles "$i"
done

谢谢 - 每次脚本运行时我们只使用一次该数组。它正在一个关键项目的定期任务上运行,所以我会在能够停止/重启它并且一切顺利后尝试这个方法。 - Dave Everitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接