Bash脚本读取CSV路径时如何正确展开$HOME为有效路径
问题原因
从CSV文件中读取的$HOME属于纯文本字符串,Bash不会自动对普通变量存储的文本内容做变量展开,因此cp命令实际收到的是包含字面量$HOME的路径,系统无法识别该路径导致拷贝失败。
解决方案
方案1:使用envsubst替换环境变量(推荐,安全)
envsubst是专门用于替换文本中环境变量的工具,绝大多数Linux发行版默认预装,不会执行文本中的任意代码,不存在注入风险。
修改后的完整脚本如下:
#!/bin/bash INPUT=destinations.csv OLDIFS=$IFS IFS=',' [ ! -f "$INPUT" ] && { echo "$INPUT file not found"; exit 99; } while read -r src dest do # 展开路径中的环境变量 src=$(echo "$src" | envsubst) dest=$(echo "$dest" | envsubst) cp -- "$src" "$dest" done < "$INPUT" IFS=$OLDIFS
注:代码中新增的
-r参数、变量双引号、--参数都是为了兼容路径包含空格、特殊字符的场景,避免脚本异常。
方案2:使用eval展开变量(仅适用于完全信任CSV内容的场景)
如果你能确保CSV文件所有内容都是安全的,没有恶意代码,可以用eval强制展开变量:
#!/bin/bash INPUT=destinations.csv OLDIFS=$IFS IFS=',' [ ! -f "$INPUT" ] && { echo "$INPUT file not found"; exit 99; } while read -r src dest do # 强制展开变量,仅在CSV完全可信时使用 eval src="$src" eval dest="$dest" cp -- "$src" "$dest" done < "$INPUT" IFS=$OLDIFS
警告:如果CSV中被植入类似
$(rm -rf /)的恶意内容,eval会直接执行该命令,导致系统损坏,非必要不推荐使用该方案。
内容的提问来源于stack exchange,提问作者G. Ianni
相关产品推荐
相关产品推荐

