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
相关产品推荐
相关产品推荐

