将数组或字符串转换为有效路径时出现问题



我正在尝试制作一个函数,使我的生活更轻松地将图像转换为pdf。我使用的是img2pdf,它是一个Python脚本。我希望能够将文件和目录传递给我的函数(带有通配符,用于扩展,如:directory/*(。

我已经解决了Windows路径转换的问题,但现在我意识到,如果路径有空格,函数就不起作用,或者Python只会在路径设置上出错。

我试着写这个函数,制作了一个包含所有文件的字符串:

imgtopdf(){
list=""
while [[ "$1" != "" ]] ; do
list+=" '$(cygpath -w "$1")'" # Tried $(echo "$list" | xargs -0 echo) but it removes back-slashes!
shift
done
list="${list:1}"
echo $list
img2pdf -o img2pdf.pdf --pagesize A4 $list
}

然后尝试使用数组来保存所有文件:

imgtopdf(){
list=()
while [[ "$1" != "" ]] ; do
list+="$(cygpath -w "$1")"
shift
done
echo ${list[@]}
img2pdf -o img2pdf.pdf --pagesize A4 ${list[*]}
}

注意:cygpath -w负责将/cygdrive/path转换为Windows路径,以便Python了解路径。

报价至关重要:使用"${list[@]}",而不是${list[*]}。冒着自私自利的风险,请参阅https://stackoverflow.com/a/12316565/7552

此外,将元素附加到数组的语法需要括号(额外的空格是可选的(:

list+=( "$(cygpath -w "$1")" )

bash中检查变量的最佳方法是使用declare -p list

imgtopdf() {
list=()
for file in "$@"; do
list+=( "$(cygpath -w "$file")" )
done
declare -p list
img2pdf -o img2pdf.pdf --pagesize A4 "${list[@]}"
}

最新更新