为何这段小型Shell脚本无法正常运行?
解决Shell脚本中AWK执行异常输出帮助信息的问题
问题描述
编写了如下Shell脚本:
#!/bin/bash initial=0.00 step=0.005 num=10 mystrain=(2.475 0 0 1 0 0) for((i=0;i<=num;i++)) do eval $(awk -v arr1="${mystrain[*]}" -v i=$i -v s=$step -v ini=$initial' BEGIN {split(arr1, adds, " "); for(j=1;j<=6;j++){ adds[j]=ini+adds[j]*i*s;} printf("Setstrain=( %9.6f %9.6f %9.6f %9.6f %9.6f %9.6f );",adds[1],adds[2],adds[3],adds[4],adds[5],adds[6])}' ) done
运行后脚本输出内容与awk -help的信息一致,怀疑是mystrain数组的输入方式有误,但未找到正确解法。
问题原因
并非mystrain数组的输入问题,而是AWK命令的参数传递格式错误:在-v ini=$initial与后续的单引号之间缺少空格,导致Shell解析参数时出现混乱,AWK无法正确识别脚本内容,进而触发帮助信息输出。
另外,直接传递未加引号的变量(如-v i=$i)存在风险,若变量包含空格或特殊字符会导致参数解析失败。
解决方法
- 在
-v ini=$initial与单引号之间添加空格,确保AWK能正确区分变量参数和脚本内容; - 所有通过
-v传递的变量用双引号包裹,避免特殊字符或空格引发的解析问题。
修正后的脚本如下:
#!/bin/bash initial=0.00 step=0.005 num=10 mystrain=(2.475 0 0 1 0 0) for((i=0;i<=num;i++)) do eval $(awk -v arr1="${mystrain[*]}" -v i="$i" -v s="$step" -v ini="$initial" ' BEGIN {split(arr1, adds, " "); for(j=1;j<=6;j++){ adds[j]=ini+adds[j]*i*s;} printf("Setstrain=( %9.6f %9.6f %9.6f %9.6f %9.6f %9.6f );",adds[1],adds[2],adds[3],adds[4],adds[5],adds[6])}' ) done
运行修正后的脚本,即可正常计算并生成Setstrain变量的赋值语句。
内容的提问来源于stack exchange,提问作者rose apple
相关产品推荐
相关产品推荐

