您的位置:首页 > 大数据 > 云计算

云计算-shell之算术扩展 和let 命令运算 和 expr 整数运算和退出状态码exit的使用

2019-03-14 23:25 531 查看

算术扩展和let进行算术运算

算术扩展
  • 可以对算术表达式求值并替换成所求得的值
  • 看一下格式: $(( 算术表达式))
    注意:算术表达式只能是整数,不能对浮点数进行算术运算

上栗子:

[root@xieqc 桌面]# var=5
[root@xieqc 桌面]# var=$(( $var + 8 ))
[root@xieqc 桌面]# echo  $var
13
//变量也可以作为运算数,上面的var不加$也可以,效果是一样的额

[root@xieqc 桌面]# x=17
[root@xieqc 桌面]# y=2
[root@xieqc 桌面]# z=$(( x%y ))
[root@xieqc 桌面]# echo  $z
1
//求余运算

[root@xieqc 桌面]# echo  $(( 10>3 ))
1
//比较运算,如果 条件成立,返回值为1 ,条件不成立,返回值为0

[root@xieqc 桌面]# a=28
[root@xieqc 桌面]# b=25
[root@xieqc 桌面]# c=$(( $(( a>b ))?a:b))
[root@xieqc 桌面]# echo  $c
28
//?号前面的结果为真,或结果数值大于1,返回a的值,否则返回b的值
let运算
  • 运算不能有空格
  • 若非要有看空格怎么办?用双引号引起来!
[root@xieqc 桌面]# let  i=i+5
[root@xieqc 桌面]# echo  $i
5
[root@xieqc 桌面]# let  i=i + 5
bash: let: +: 语法错误: 期待操作数 (错误符号是 "+")
[root@xieqc 桌面]# echo  $i
5
[root@xieqc 桌面]# let  "i=i + 5"
[root@xieqc 桌面]# echo  $i
10
[root@xieqc 桌面]#let  i++
[root@xieqc 桌面]#echo  $I
11
//变量后递增加1

[root@xieqc 桌面]# let  “i  =  i <6  ?     i  :   6 ”
//问号? 前的表达式值为真,取i的值,否则取6
[root@xieqc 桌面]#echo  $i
6
上诉变量i的值不存在间断的情况,结合在一起看。
expr运算命令
  • 这是一个对运算表达式求值,并输出结果
  • 只支持整数运算,不支持浮点运算数
  • 运算符必须包含空格,否则不识别,会输出算术表达式
  • 特殊运算符还需要 \ 进行转义,否则语法错误

算了,这么麻烦不用了…
来,说归说,闹归闹,还是举个栗子看一下:

[root@xieqc 桌面]# expr  6  +  8
14
[root@xieqc 桌面]# expr  6+8
6+8
//看到了吗,不加空格你试试!
[root@xieqc 桌面]# expr  6  \*  8
48
//转义

[root@xieqc 桌面]# expr  1 \< 2
1
[root@xieqc 桌面]# expr  2 \>  5
0
//结果为真,则返回1,否则返回0

[root@xieqc 桌面]# a=25
[root@xieqc 桌面]# b=24
[root@xieqc 桌面]# expr  $a \*  $b
600
//支持变量进行运算哦
退出状态码 exit 的使用
对于一个好的脚本来说,当它运行完成时,应该返回一个退出状态,否则是没有灵魂的
  • 每一个命令都会返回一个退出状态
  • 运行成功会返回0
  • 可以通过$? 的值去查看返回值
  • 不成功会返回一个非0值

举个栗子看一下:

cd  $SOME_DIR
rm  -rf  *

这两行代码看起来没什么问题,但是,仔细考虑一下,如果SOME_DIR不存在呢?
会发生什么事情?
在这种情况下,cd命令失败,而rm删除的命令会在当前命令下执行,好,可以跑路了对吧。
上诉脚本的问题在于,运行rm命令之前没有检查cd命令的退出状态

怎么办?
往下看:

exit命令
  • exit N 可以提交一个退出状态码给shell
  • N 必须是0~255之间的整数
  • 错误时,返回一个非0值
  • 正确时,返回0
cd  $SOME_DIR
if  [ $? -eq  0  ];then
rm  -rf  *
else
echo  "Cannot  change  directory!"
exit 1
fi
//如果cd命令失效,会打印一个错误信息,返回状态码1
  • 特别是在备份脚本中,状态码更显得重要了。
调试脚本
  • bash -x 以调试模式运行脚本
  • bash -v 激活详细输出模式
  • bash -xv 这就更加详细的进行调试输出信息了
    执行下面的命令之后,调试 时可以显示行号:
    $ export PS4='+{$LINENO:${FUNCNAME[0]}}'

    解释一下,LINENO表示shell脚本的当前行号
    PS4 调试时那个+号就是它定义的
    FUNCNAME 包含了当前在执行调用堆栈中的所有shell的函数名称的数组变量

还有很多类似的内置变量,都对调试有用的,可以使用man bash 去看看。

  • bash -n 调试shell脚本中是否存在语法错误
最后我们聊一下shell脚本编程风格:
  1. 每行代码不多于80个字符
  2. 保持一致的缩进深度
  3. 每一个代码块之间留一个空行,提高脚本的可读性
  4. 必须要有注释
  5. 必须要有注释
  6. 必须要有注释
  7. 说三遍!
  8. 不是为了让别人看懂,是给你自己看的(很久之后的自己…你懂得!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: