Bash脚本动态路径生成异常求助:输出不符合预期
问题分析与解决
问题根源
你遇到的路径错乱问题,核心原因是输入参数filename(或脚本文件本身)带有不可见的回车符(\r)。比如从Windows环境复制参数/脚本时,会引入CRLF格式的换行符,导致变量$filename的实际值是sales\r而非纯sales。
当拼接路径data/$filename/$filename.csv时,\r会触发终端光标回到行首,后面的.csv会覆盖前面的路径内容,最终出现csvsales这类错乱输出。而仅写path=data/$filename/时,因为后面没有额外字符覆盖,所以看起来输出正常,但变量里的\r依然存在。
解决方法
1. 清理变量中的回车符
在给filename赋值后,添加一行代码去除变量里的\r:
# 方法1:用tr命令清理 filename=$(echo "$1" | tr -d '\r') # 方法2:用Bash参数替换(更高效) filename=${1//$'\r'/}
2. 修复脚本文件的换行格式
如果脚本本身是Windows CRLF格式,用dos2unix工具转换为Linux LF格式:
dos2unix demo.sh
3. 完整修改后的脚本
#!/bin/sh # 清理参数中的回车符 filename=${1//$'\r'/} # 提前创建目标目录,避免aws cp因目录不存在报错 mkdir -p data/$filename path=data/$filename/$filename.csv echo "$path" aws s3 cp s3://bucket/key/$filename.csv "$path"
验证
执行sh demo.sh sales后,echo $path会正确输出data/sales/sales.csv,aws cp也能正常将文件复制到目标路径。
内容的提问来源于stack exchange,提问作者Learn Hadoop
相关产品推荐
相关产品推荐

