使用grep提取日志数值后执行bash算术运算出现expr报错如何解决
问题原因
- 变量赋值语法错误:Bash 变量赋值时等号两侧不允许有空格,
NU = expr这类写法会被系统识别为尝试执行名为NU的命令,而非给变量赋值 - 命令返回值未正确捕获:要将命令输出赋值给变量,需要用
$()将整段命令包裹 - 提取的数值携带多余空格:之前的
awk语句中print $3" "额外输出了空格,变量内的空白字符会引发计算逻辑报错 - 运算工具混用逻辑错误:
expr仅支持整数运算,你需要的百分比计算涉及浮点数除法,统一使用bc处理更合适
修复后的完整代码
#!/bin/bash # 数值提取部分,去掉awk多余的空格输出 DS=$(grep DS $1 | awk '{print $3}') echo "DS=$DS" DI=$(grep DI $1 | awk '{print $3}') echo "DI=$DI" UU=$(grep UU $1 | awk '{print $3}') echo "UU=$UU" TI=$(grep TI $1 | awk '{print $3}') echo "TI=$TI" BL=$(grep BL $1 | awk '{print $3}') echo "BL=$BL" RE=$(grep RE $1 | awk '{print $3}') echo "RE=$RE" PU=$(grep PU $1 | awk '{print $3}') echo "PU=$PU" PT=$(grep PT $1 | awk '{print $3}') echo "PT=$PT" FU=$(grep FU $1 | awk '{print $3}') echo "FU=$FU" # 计算部分,整数运算用bash算术扩展,浮点运算用bc NU=$((DS + DI + PT + PU)) echo "NU=$NU" DE=$((FU - UU - TI - BL - RE)) echo "DE=$DE" # scale=2表示保留2位小数,可根据需要调整数值 Result=$(echo "scale=2; $NU / $DE * 100" | bc -l) echo "Result=$Result%"
运行效果
执行bash Script.sh Case1.log后输出如下:
DS=1625 DI=393 UU=210 TI=52 BL=4 RE=9 PU=123 PT=420 FU=3186 NU=2561 DE=2911 Result=87.97%
内容的提问来源于stack exchange,提问作者Pavan Kumar
相关产品推荐
相关产品推荐

