bash 编程常见错误速查

时间:2022-10-04 00:49:46

背景

bash 以其短小精悍著称,对于熟悉它的人来说,能够快速实现功能。不过由于其部分语法特别不友好,一旦出现问题排查比较麻烦。下面持续总结一些常见问题,以备后续速查。

案例

算术运算的操作数包括非数字符合

假设有下面的脚本a.sh, 其内容如下:

#!/bin/sh
d1=`curl -l http://10.1.2.3:9014/vars/write_latency | awk '{print $3}'`
d2=2
((d3=d1+d2))

上面代码从curl的输出中获取write_latency , 并加上d2的值(2), 一起给d3. 看起来简单,但运行中会出下面的症状:

)syntax error: invalid arithmetic operator

解决办法:

进入debug 模式

#!/bin/sh
set -x 
d1=`curl -l http://10.1.2.3:9014/vars/write_latency | awk '{print $3}'`
d2=2
((d3=d1+d2))

执行

sh ./a.sh

可以看到除出现上面的错误之外,还可以看到d1的输出中包括一个\r字符!!显然其不是数组类型,无法执行预期的算术运算。

解决办法

可以用d1=$(echo $d1)来去掉d1中没必要的非数字符合。

用bash函数的输出赋值给变量

示例:

#!/bin/sh
set -x 

function mytest() {
d1=`curl -l http://10.1.2.3:9014/vars/write_latency | awk '{print $3}'`
d2=2
((d3=d1+d2))
echo $d2
return $ds;
}

output=`mytest `
echo $output

症状:发下output不是预期的d3的值,因为自定义的函数的输出不像原生的shell 指定杨输出可以直接来给变量赋值。

解决办法:在bash函数中返回期望拿到的值,调用者用$? 获取

#!/bin/sh
set -x 

function mytest() {
d1=`curl -l http://10.1.2.3:9014/vars/write_latency | awk '{print $3}'`
d2=2
((d3=d1+d2))
echo $d2
return $ds;
}

mytest 
output=$?
echo $output

curl 指令在函数调用中出现非预期输出

示例:部分指令或者函数的输出和调用者相关,比如curl -l 和curl -s 的输出在函数调用中表现不同。

症状:如果使用curl -l ,在函数调用中会多长一部分头部的输出:

解决办法:尽量使用能够看到期望输出结果的情况下最小输出模式