算术扩展
语法:$((算术式))
如:
[root@localhost tmp]# i=$((8+20))
[root@localhost tmp]# echo $i
28
计算8+20的值,并且把值传给i
chapter8
算术运算
echo $((${j:-8}+2))
10
如果j不存在或者是控制,则${j:-8}结果为8,在和2做加法运算,
同理
echo $((k+4))
如果k不存在,则,值为0+4
小括号可以改变运算的优先级,如8*(1+3),则小括号的加法先算,在和8进行乘法运算
递增1
[root@localhost tmp]# r=6
[root@localhost tmp]# echo $((++r))
7
递减1
[root@localhost tmp]# r=6
[root@localhost tmp]# echo $((--r))
5
[root@localhost tmp]# echo r=$((4+m--))
r=10
[root@localhost tmp]# echo $m
5
[root@localhost tmp]
位左移
位右移
[root@localhost tmp]# m=16
[root@localhost tmp]# echo r=$((m<<2)) 以2进制的方式向左移一位,等于把值放大4倍
r=64
[root@localhost tmp]# echo r=$((m>>2)) 以2进制的方式向右移一位,等于把值减少4倍
r=4
[root@localhost tmp]#
使用外部程序expr做算术运算
加法expr 3 + 2
减法expr 3 - 2
乘法expr 3 \* 2
除法 expr 4 / 2
余数 expr 3 % 2
递增1
r=1
r=`expr $r +1`
expr对比样式
[root@localhost tmp]# r=`expr match "string" st`
[root@localhost tmp]# echo $"r=`expr match "string" st`"
r=2
[root@localhost tmp]# echo $"r=`expr match "string" str`"
r=3
[root@localhost tmp]# echo $"r=`expr match "string" stri`"
r=4
expr取字符串
[root@localhost tmp]# echo $"r=`expr substr "string" 1 3`"
r=str
[root@localhost tmp]# echo $"r=`expr substr "string" 2 3`"
r=tri
[root@localhost tmp]# echo $"r=`expr substr "string" 4 3`"
r=ing
由第1个字符s开始,取出3个字符长度的子字符串,2个例子同理
计算字符长度
echo $"r=`expr length "string"`"
r=6
使用$[]做算术运算和$()类似
[root@localhost tmp]# echo r=$[4+5]
r=9
[root@localhost tmp]# echo r=$[4-5]
r=-1
[root@localhost tmp]# echo r=$[4*5]
r=20
[root@localhost tmp]# echo r=$[4/5]
r=0
使用bash内置命令declare let做算术运算
declare -i I
I=8+1
I=8-1
I=8*2
I=8/2
I=8**8
let
let I=8+1
let I=8-1
let I=8*2
let I=8/2
let I=8**8
流程控制
流程控制有2大类,选择和循环,属于选择的有if case 属于循环的有for while until 命令 select 即属于选择也属于循环
bash的内置变量$?用来存储每个命令执行后的传回状态值,
如果执行一个未知命令则传回状态$?为127,。如果一条命令没有执行权限则为126!
if语法
if-then-else
if 条件测试; then
命令区域
fi
if-then-else
if 条件测试 ;then
命令区域1
else
命令区域2
fi
解释:如果条件测试为真,就执行命令1,如果为假则执行命令2
例子:
#!/bin/bash
declare -i a b #将 a b 设为整数
a=$1
b=$2
if ((a<b))
then
echo "$a 大于 $b" ###如果a小于b那么现实a小于b
elif ((a>b))
then
echo "$a 小于 $b" ###如果第一个条件不成立,检查a是否大于b,返回结果
else
echo "$a 等于 $b" ####以上两个都不是的话,那么a肯定等于b
fi #fi结束
条件测试的写法
条件测试或条件判断,有多种形式,测试结果是真是假,就看传回的值是否为0
总结下来有以下10种
1:执行某一个命令的结果
这里的命令可包括管道命令,如命令1 命令2 命令3 其结束状态为最后一个命令执行的结果
if grep -q "rm" test.sh #grep -q 表示不现实,借助$?来传回执行结果
then
echo "fine rm"
else
echo "not find"
fi
传回某一执行结果的向相反值
其形式为!命令
解释,如果命令传回值为0 则加上!之后变为1,反之如果为非0,则假上!变为0
if !grep -q "rm" test.sh
then
echo "not fine rm"
else
echo " finded"
fi
使用bash关键词 [[',']] 组成的式子:[[判断式]]
判断式会传回真假值,0为真,非0为假
if [[ str > xyz ]]
then
echo "str big"
else
echo "xyz big"
fi
使用内置命令test判断
if test "str" \> "xyz"
then
echo "str big"
else
echo "xyz big"
fi
使用内置命令[]
[]和test用法相同,两者可以改写互换
使用 -a -o进行逻辑组合
-a是且的意思
-o是或的意思
&&
称为逻辑的and,如果命令1为真,才会执行命令2
a=20
if grep -q "rm" test.sh && [ $a -lt 100 ] #线搜寻test.sh中有没有rm这个字符串,如果有比较$a和100 如果小于传回ok,反之则not ok
then
echo "ok"
else
echo "not ok"
fi
~
&&特性经常来当做一种隐性的if语法
[ -z "$ps1" ] && return
解释,线判断$ps值是否为空,如果是就执行return命令,由自shell环境,返回父shell,等于是激素执行了该脚本,
如果用if
if [ -z "$ps1" ] ; then return ;fi
[ -f /proc/net/if_inet6 ] && echo '支持 ipv6'
||
逻辑或,如果命令1执行结果为假,才会执行命令2
a=200
if grep -q "rm" tst.sh || [ $a -lt 100 ]
then
echo "ok"
else
echo "not ok"
fi
||,也可以当做是一种隐性的if语法!
prefix="/home"
defpath="/usr/local/bin"
[ -z ${prefix:-} ] || prefix=${defpath%/*} -z测试$prefix ,一位$prefix值为非空,所以,${prefix:-}变量扩展的传回值为prefix的变量值,非空为假,更具||的特性会执行prefix=${defpath%/*}
他会有$defpath后方删除符合样式的/*的最短字符串,即删去/bin,因此$prefix 的值为/usr/local
echo $prefix
/usr/local
如果改写为if语句为!
prefix=/home
defpath=/usr/local/bin
if [ -z ${prefix:-} ]
then
prefix=${defpath%/*}
fi
&&和||合用
if [ -n "$DEBUG" ]
then
set -v
else
set +v
fi
一些小总结
[[]], test, [] 的意思和用法是相近的,但是[[]] 比其他两个更有自由 因为 [[]] 不必担心某些bash特殊字符对运算符的影响,不急写一叠转义字符,
比如 [[ str < xyz ]] 但是在[] 中却要写成[ str \> xyz ] 转义忘了。容易发生错误,在[[]]中 < > && || 等都可以自由的使用,不必使用转义字符
除了[[]] 外bash中(())也不必理会上述提到的特殊字符
另外要注意的是在[[ 判断式 ]] 中,如果使用== 或者是!= 如果没有加单引号或者双引号则==, !=会视为对比该字符串所形成的样式,如果相符传回0,如果不符传回1
例子:
a=str
if [[ $a ==??? ]] ;then
echo "match"
fi
如果把???改为"???" 此时==就变成是判断$a 和字符???是否相等
for i in 算术,变量,循环判断=苦逼,坑爹; do echo $i;done(一)
原创
©著作权归作者所有:来自51CTO博客作者风光坏家伙的原创作品,如需转载,请与作者联系,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
while do done
while do done
bash Bash 循环结构