我有一个包含空格的文件夹路径。我用反斜线逃离了空间。 curl命令在命令行上运行。如果我在我的脚本中运行它会崩溃,认为文件夹路径的各个部分是单独的参数。
脚本遍历目录并卷曲所有文件夹/文件 代码
while IFS= read -r -d '' file
do
filepath=$(dirname "$file")
#escape spaces
filenew=$(echo $file | sed -e 's/\s/\\ /g')
curl -k -T "$filenew" --ftp-ssl --ftp-pasv --ftp-create-dirs -u ${username}@${domain}:${pass} $ftpuploadpath
done < <(find ${folderpath} -type f -print0)
echo "$file"
错误
Transferring Sample_Project/folder\ spaces/test.docx
0 Sample_Project/folder spaces/test.docx
curl: Can't open 'Sample_Project/folder\ spaces/test.docx'!
curl: try 'curl --help' or 'curl --manual' for more information
curl: (6) Couldn't resolve host 'spaces'
答案 0 :(得分:1)
行情,人物,报价。使用sed
将语法元素(在本例中为反斜杠)添加到数据中绝对没有意义,因为语法解析会在参数扩展发生之前发生。
while IFS= read -r -d '' file; do
filepath=$(dirname "$file")
curl -k --ftp-ssl --ftp-pasv --ftp-create-dirs \
-T "$file" \
-u "${username}@${domain}:${pass}" \
"$ftpuploadpath"
done < <(find "$folderpath" -type f -print0)
请注意:
-T "$file"
确保将文件名作为单个参数传递给curl
。数据中不需要添加文字反斜杠以产生此效果。"${username}@${domain}:${pass}"
需要引用,以防止任何这些元素中的任何空格或整数字符通过字符串拆分和全局扩展影响行为(考虑以<space>*
结尾的密码;您不希望在命令行中添加本地目录中的文件名列表。)