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

Shell脚本重构:循环内调用sed处理脚本出现语法错误求助

你遇到的报错和重定向运行逻辑无关,是两类常见的shell脚本执行问题:


1 换行符格式异常导致的语法错误

你上报的两个报错是典型的**DOS/Windows格式换行符(CRLF)**引发的问题:

  • Windows环境编辑的脚本行尾是\r\n,Linux/UNIX的shell仅识别\n为换行符,剩余的\r会被当做命令内容的一部分
  • 解析第二行时,shell实际读到的是空字符+\r,会尝试执行\r这个不存在的命令,报错信息里脚本名显示错乱也是因为\r会把光标移动到行首,覆盖了前面的sed_command字符
  • 第二个语法报错unexpected "done" (expecting "do"),同样是\r干扰了shell对do/done关键字的配对识别

解决方法

用dos2unix工具转换两个脚本的换行符为Linux格式:

dos2unix sed_command.sh 你的循环脚本文件名.sh

没有dos2unix也可以用sed直接转换:

sed -i 's/\r$//' sed_command.sh 你的循环脚本文件名.sh

2 循环内脚本调用路径错误

你在循环中执行了cd $team切换到子目录,调用时直接写sh sed_command.sh,如果你的sed_command.sh是存放在循环起始的/etc/newman/Newman根目录下,切换子目录后shell会找不到这个脚本,触发执行异常。

解决方法

调用sed_command.sh时使用绝对路径,修改循环内的调用逻辑:

if [ ! -z "${CSV_FILE}" ] ; then sh /etc/newman/Newman/sed_command.sh  ${CSV_FILE} > ${CSV_FILE}_Newman; else echo "No CSV files to transform"; fi

其他可优化项

  • 你当前用ls获取CSV文件的方式有缺陷:如果目录下存在多个csv文件,所有文件名会被塞到同一个变量里,传参给脚本会出现异常,建议改成匹配后遍历处理:
    for csv_file in /etc/newman/Newman/$team/$scope/*.csv; do
      [ -f "$csv_file" ] || continue
      echo "Transforming : $csv_file"
      sh /etc/newman/Newman/sed_command.sh "$csv_file" > "${csv_file}_Newman"
    done
    
  • sed_command.sh里的while read循环没有处理行尾空格、忽略反斜杠转义的逻辑,建议改成while IFS= read -r line,避免丢行或者内容解析异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:24:08