背景
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 ,在函数调用中会多长一部分头部的输出:
解决办法:尽量使用能够看到期望输出结果的情况下最小输出模式