echo >>在Shell脚本中报错文件不存在的问题求助
问题分析与解决方案
核心原因:目标目录不存在
echo >> .var/vc "xxx"无法自动创建文件的根本问题是**.var目录未提前创建**。echo >>仅能自动生成文件,无法递归创建上级目录。终端中你可能手动创建过.var目录,所以命令正常;但脚本首次运行时该目录不存在,导致写入失败。
修复步骤
提前创建
.var目录
在执行写入操作前,先检查并创建目标目录:mkdir -p .var-p参数会自动生成不存在的上级目录,且目录已存在时不会报错。修正
echo命令语法
原写法虽无语法错误,但将重定向放在末尾更规范,避免歧义:echo "Don't remove this file please." >> .var/vc其他脚本优化建议
- 路径引用添加引号,避免空格或特殊字符引发错误:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") cd "$basedir" ver=$(sed '1!d' "../.version") - 条件判断改用更直观的匹配方式:
将if [ h$ff == hy ] || [ h$ff == hY ]; then替换为:if [[ $ff =~ ^[Yy]$ ]]; then - 检查依赖工具
wget是否存在,避免脚本意外中断:if ! command -v wget &> /dev/null; then echo "Error: wget is not installed." exit 1 fi
- 路径引用添加引号,避免空格或特殊字符引发错误:
修复后的关键代码片段
#!/bin/bash NC='\\033[0m' #Reset text color. P='\\033[0;35m' #Purple basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") #get the base directory of start.sh cd "$basedir" ver=$(sed '1!d' "../.version") #get local version # 确保.var目录存在 mkdir -p .var if ! [ -f .var/asked ]; then #this is in place so it only asks the below question once, ever. if ! [ -f .var/vc ]; then #I don't know why this is here anymore echo "Would you like ScratchLang to check its version every time you start it? [Y/N]" read -sn 1 ff if [[ $ff =~ ^[Yy]$ ]]; then echo "Don't remove this file please." >> .var/vc #when start.sh detects this file, it will check for a new version. fi echo "Don't remove." >> .var/asked fi fi # 后续代码保持不变...
内容的提问来源于stack exchange,提问作者OK9090
相关产品推荐
相关产品推荐

