Bash文本替换脚本报错求助:出现unexpected token `then'语法错误
Bash脚本替换子串并记录日志的错误修正
原脚本的主要问题
- if语句语法与逻辑错误:
if [$#-ne3]; then中,[后、-ne前后、3前都需要空格,且脚本采用交互式输入(用read获取参数),而非命令行参数传入,$#的值始终为0,这个判断完全多余且逻辑错误。- 结构混乱:if块后错误添加了独立的
then,正确分支结构应为if ...; then ... else ... fi。
- 命令语法错误:
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间缺少空格、右括号缺失。
- 日志路径错误:要求写入
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
相关产品推荐
相关产品推荐

