Bash脚本中含空格文件名被截断的问题求助
解决Bash脚本传递含空格文件名的问题
问题根源
你当前使用"${documents[*]}"传递数组参数时,Bash会将数组内所有元素用空格拼接成单一字符串。当download.sh接收这个字符串后,会默认按空格拆分参数,导致/datalog/AB errors.txt被拆成/datalog/AB和errors.txt两个独立参数,无法识别为完整文件名。
解决方案
1. 修改主脚本的参数传递方式
将数组传递的"${documents[*]}"替换为"${documents[@]}",后者会把数组中的每个元素作为独立参数传递,完整保留含空格的文件名:
#!/bin/bash documents=("/datalog/AB errors.txt") /usr/bin/bash /home/user/download.sh "${documents[@]}"
2. 确保download.sh正确接收参数
在download.sh中,必须用"$@"来遍历所有传入的参数,这样每个带空格的文件名都会被当作整体处理。示例如下:
#!/bin/bash # 遍历所有传入的文件路径,每个路径作为独立参数 for file_path in "$@"; do # 替换为你的实际SCP命令,注意用双引号包裹$file_path scp remote_user@remote_host:"$file_path" /your/local/download/dir/ done
关键说明
"${array[@]}":传递数组时,会将数组的每个元素作为独立参数,完整保留元素内的空格和特殊字符。"$@":在接收参数的脚本中,代表所有传入的参数,能确保每个参数的完整性不被拆分。
内容的提问来源于stack exchange,提问作者abbb
相关产品推荐
相关产品推荐

