Linux Shell中如何结合cd与read命令实现目录切换
关于Shell中cd与read命令整合使用的说明
cd和read完全可以整合实现交互式路径切换,你写的基础逻辑思路是对的,但存在几个鲁棒性缺陷,不属于可稳定运行的标准写法。
现有代码的问题
- 缺失输入非空校验:如果用户输入时直接回车,
$loc为空值,命令会直接执行cd /home/dir/,跳转到父目录而非预期的子目录 - 缺失异常判断:如果用户输入的子目录不存在、当前用户无目录进入权限,
cd会抛出报错但脚本不会做拦截处理,后续逻辑会在错误的工作目录下执行 - 特殊字符兼容问题:如果用户输入的目录名包含空格、通配符等特殊字符,未加引号的变量展开会导致cd识别路径错误,切换失败
标准参考写法
#!/bin/bash # 定义根目录常量,避免硬编码重复书写 BASE_DIR="/home/dir" # 读取用户输入,-p参数指定提示语,提示语后加空格优化交互展示 read -p "请输入要切换的子目录名称: " loc # 校验输入非空 if [ -z "$loc" ]; then echo "错误:目录名称不能为空" exit 1 fi # 拼接目标完整路径 target_path="${BASE_DIR}/${loc}" # 校验目标路径是否存在且为有效目录 if [ ! -d "$target_path" ]; then echo "错误:路径 $target_path 不存在或不是可进入的目录" exit 1 fi # 执行cd切换,变量加双引号兼容空格等特殊字符,同时判断执行结果 if cd "$target_path"; then echo "已成功切换到目录: $(pwd)" else echo "切换目录失败,请检查当前用户的目录访问权限" exit 1 fi # 后续业务逻辑写在此处,执行时工作目录已切换到目标路径
常见踩坑提示
如果你希望脚本执行完后,当前交互Shell的工作目录也保持切换后的状态,不要用sh script.sh或./script.sh的方式运行——这类运行方式会启动独立子Shell执行脚本,目录切换仅在子Shell内生效,脚本退出后当前Shell的工作目录不会变化。需要让切换在当前Shell生效的话,要用source script.sh或者. script.sh的方式加载执行脚本。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

