Bash自定义文件复制脚本条件判断模块报错求助
修复你的Bash文件复制脚本中的条件判断Bug
我帮你梳理下脚本里的几个关键问题,以及对应的修复方案:
脚本里的核心Bug点
- 波浪号使用错误:
mkdir ~$dir会把用户输入的目录名强行拼在你的家目录后面,比如用户输入./target,会变成~/./target,完全偏离了用户预期的路径逻辑。 - 未处理目录已存在的情况:当前代码只有在目录不存在时才执行复制操作,如果目录已经存在,脚本就直接跳过复制步骤了,这显然不符合「把文件复制到目标目录」的核心需求。
- 变量未加引号:
cp $files $dir和ls $dir中的变量没有用双引号包裹,一旦文件名/目录名包含空格、特殊字符(比如my file.txt),命令会直接解析失败。 - 退出码不规范:文件不存在时用
exit 0,但0在Bash里代表「成功退出」,这种错误场景应该用非0退出码(比如exit 1)来明确告知执行失败。 - 目录创建无容错:如果目标目录是多级路径(比如
docs/backup/files),直接用mkdir会因为父目录不存在而失败,需要递归创建的参数。
修正后的完整脚本
#!/bin/bash echo "Enter filename to copy:" read files echo echo "Enter Directory to copy files to:" read dir echo echo "Copying file '$files' to '$dir' directory..." # 检查源文件是否存在 if [ ! -e "$files" ]; then echo "Error: File '$files' does not exist." exit 1 fi # 确保目标目录存在,不存在则创建 if [ ! -d "$dir" ]; then echo "Target directory '$dir' does not exist, creating it..." mkdir -p "$dir" # 检查目录创建是否成功 if [ $? -ne 0 ]; then echo "Error: Failed to create directory '$dir'." exit 1 fi fi # 执行复制操作并检查结果 if cp "$files" "$dir"; then echo "Successfully copied file to '$dir'." echo "Contents of target directory:" ls -l "$dir" else echo "Error: Failed to copy file '$files' to '$dir'." exit 1 fi
关键修改说明
- 移除错误的波浪号:直接使用用户输入的
$dir作为路径,完全尊重用户指定的路径逻辑。 - 调整逻辑流程:不管目标目录是否存在,最终都会执行复制——目录不存在就先创建,存在就直接复制。
- 变量加双引号:所有包含用户输入的变量都用双引号包裹,彻底避免空格、特殊字符导致的命令解析错误。
- 增加错误检查:在创建目录和复制文件后都检查执行状态,给出更明确的错误提示,方便排查问题。
- 使用
mkdir -p:递归创建多级目录,哪怕父目录不存在也能成功创建目标路径。 - 规范退出码:错误场景统一用
exit 1,成功场景由脚本正常结束自动返回exit 0,符合Bash的退出码规范。
内容的提问来源于stack exchange,提问作者Favour George
相关产品推荐
相关产品推荐

