You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash文本替换脚本报错求助:出现unexpected token `then'语法错误

Bash脚本替换子串并记录日志的错误修正

原脚本的主要问题

  1. if语句语法与逻辑错误:
    • if [$#-ne3]; then 中,[ 后、-ne 前后、3 前都需要空格,且脚本采用交互式输入(用read获取参数),而非命令行参数传入,$#的值始终为0,这个判断完全多余且逻辑错误。
    • 结构混乱:if块后错误添加了独立的then,正确分支结构应为if ...; then ... else ... fi。
  2. 命令语法错误:
    • sed"s/$str1/$str1/g" $file:sed与引号间缺少空格,替换目标应为$str2而非$str1,且未加-i参数实现原地修改文件。
    • size=$(ls -| $file | awk '{print $5}':ls参数错误(应为-l)、管道符号写错、命令替换的右括号缺失。
    • date=$(date"+%Y-%m-%d %H:%M":date与格式化字符串间缺少空格,右括号缺失。
    • sha=$(shasum -a 256 %file | awk '{print$1}':%file应为$file、print与$1间缺少空格、右括号缺失。
  3. 日志路径错误:要求写入src/files.log,原脚本写为当前目录的files.log。

修正后的脚本

#!/bin/bash
echo "Type the file name: "
read file
echo "Which string you will change? "
read str1
echo "What you will write there? "
read str2

# 检查文件是否存在
if [ ! -f "$file" ]; then
    echo "This file doesn't exist"
    exit 1
fi

# 原地替换文件中的子串
sed -i "s/$str1/$str2/g" "$file"

# 获取文件大小
size=$(ls -l "$file" | awk '{print $5}')
# 获取当前时间
date=$(date "+%Y-%m-%d %H:%M")
# 获取文件sha256哈希
sha=$(shasum -a 256 "$file" | awk '{print $1}')

# 记录修改信息到指定日志文件
mkdir -p src  # 确保src目录存在
echo "T02D02/src/$file - $size - $date - $sha - sha256" >> src/files.log

关键修改说明

  • 替换无效的参数数量判断,改为检查目标文件是否存在([ ! -f "$file" ])。
  • 修正sed命令:添加-i实现原地修改,修正替换变量,补充必要空格,并给文件路径加引号避免空格问题。
  • 修复所有命令替换的括号缺失问题,修正命令参数格式(如ls -l、date的空格、shasum的变量引用)。
  • 添加mkdir -p src确保日志目录存在,避免写入失败。
  • 修正日志路径为src/files.log,并调整文件路径格式为T02D02/src/$file(原脚本中缺少斜杠,已补充)。

内容的提问来源于stack exchange,提问作者petrus000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 22:10:04