计算、判断
两个变量相加 c=$[$a+$b] 或者 c=$(($a+$b)) echo $((a++)) $(($a+3))
计算() if (($1<5))
if [ $(($1%2)) == 0 ];then # 取余判断奇偶
echo "this is even num"
else
echo jishu
判断整数大小[] if [ $i -lt 5 ] 判断浮点数大小 [ `echo "$a>$b" | bc` -ne 0 ] # 或-eq 1
${} ${a}b
zzx@zzx:~$ a=1.1
zzx@zzx:~$ b=2.2
zzx@zzx:~$ echo "$a>$b"
1.1>2.2
zzx@zzx:~$ echo "$a>$b"|bc
0
zzx@zzx:~$ echo "$b>$a"|bc
1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#!/bin/bash
while :;
do
read -t 10 -p "pls input two number" a b
expr $a + 0 >/dev/null 2>&1 #注意+两边的空格一定要留
[ $? -ne 0 ] && echo "the first num is error" && continue
expr $b + 0 >/dev/null 2>&1
[ $? -ne 0 ] && echo "the second num is error" && continue || break
done
echo your input are two int_num: $a and $b
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
zzx@zzx:~$ a=`expr 1 \> 2`
zzx@zzx:~$ echo $a
0
zzx@zzx:~$ a=`expr 11 \> 2`
zzx@zzx:~$ echo $a
1
输入一个数 打印出相反 123 打印321
#!/bin/bash
read -p "please input a num:" a
n=0
b=0
while(($a>0))
do
c=`echo " $a % 10 "|bc`
b=`echo " $b * 10 + $c "|bc`
a=`echo " $a / 10 "|bc `
done
echo $a
echo $b
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if [[ $1 =~ ^-?[0-9]+$ ]]; then
echo zhengshu
elif [[ $1 =~ ^-?[0-9]+\.[0-9]+$ ]];then
echo fudianshu
else
echo bufu
fi
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if [ $a -ne 1 -a $a != 2 ]
- for i in $(seq 0 4);do echo $i;done
- for i in `seq 0 4`;do echo $i;done $(命令) 等于 `命令`
- for ((i=0;i<5;i++));do echo $i;done #最后一个可以不加 ;
- for i in {0..4};do echo $i;done
a=5; ((a++))
- if [ $a -ne 1] && [ $a != 2 ]
- if [[ $a != 1 && $a != 2 ]]
判断 数字 奇偶数
#!/bin/bash #脚本有点问题 当为浮点数会出错
if [ $# != 1 ];then ###
echo "please input one arg"
exit 1;
else
jd=`echo $1 |bc 2>/dev/null` # 如果输入数字bc等到结果还是原数字 当字母加数字或者符号时是会出错 传给黑洞
# echo $jd 数字为原结果 字母开头的为0 数字开头带字母或者符号的为空
if [ 1"$jd" == 1$1 ];then ##echo 输入的是数字 加一个1防止$jd为空
#if [[ $1 =~^-?[0-9]+$ ]];then
if [ $(($1%2)) == 0 ];then # 取余判断奇偶
echo "this is even num"
else
echo jishu
fi #
else
echo 请输入数字
exit 1
fi ##
fi ###
fi几种特殊的替换结构:${var:-string},${var:+string},${var:=string},${var:?string}
四种模式匹配替换结构:${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
if [ ]
[ -d 文件 ] 为真 如果 文件 存在 而且 是一个 目录。
[ -e 文件 ] 为真 如果 文件 存在。
[ -f 文件 ] 为真 如果 文件 存在 而且 是一个 普通 文件。
[ -r 文件 ] 为真 如果 文件 存在 而且 是可读的。
[ -w 文件 ] 为真 如果 文件 为真 如果 文件 存在 而且 是可写的。
[ -x 文件 ] 为真 如果 文件 存在 而且 是可执行的。
[ 文件1 -ot 文件2 ] 为真 如果 文件1 比 文件2 旧, 或者 文件2 存在而且 文件1 不存在。
[ 文件1 -ef 文件2 ] 为真 如果 文件1 而且 文件2 refer to the same device 而且 inode
numbers。
[ -z STRING ] 为真 如果 "STRING"的长度是零。
[ -n STRING ] 或者 [ STRING ] 为真 "STRING"的长度是非零值。
[ 表达式1 -a 表达式2 ] 如果表达式1 而且表达式2 同时为真则为真 。
[ 表达式1 -o 表达式2 ] 如果表达式1 或者表达式2 其中之一为真则为真。
zzx@sdcm152:~$ var=1
zzx@sdcm152:~$ var=$var+1
zzx@sdcm152:~$ echo $var
1+1
zzx@sdcm152:~$ var=1
zzx@sdcm152:~$ let "var+=1" # 或 let var+=1 这种写法运算符间不能有空格
zzx@sdcm152:~$ echo $var
2
zzx@sdcm152:~$ a=1
zzx@sdcm152:~$ ((a+=1)) #let可以用(())代替,let ″j=i*6+2″等价于((j=i*6+2))
zzx@sdcm152:~$ echo $a
2
zzx@sdcm152:~$ a=2
zzx@sdcm152:~$ echo $((a++))
2
zzx@sdcm152:~$ a=1
zzx@sdcm152:~$ echo $((++a))
2
zzx@sdcm152:~$ var=1
zzx@sdcm152:~$ var=`expr $var + 1`
echo $varzzx@sdcm152:~$ echo $var
2
上面的这几种做法都是只能处理整数运算,下面的这种做法是可以处理浮点数的: bc是linux上面的一个计算器,支持除位运算以外的所有运行
var=1
var=`echo "scale=1;$var*2.0"|bc` bc预设输出整数,用scale 指定小数点下位数 scale=n(当输入这条命令时,除法运算可以保留n位小数)
echo $var
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- bc -l 进入bc
- scale=10 将小数位定为10位
- e(1) 计算e的小数点后10位
- quit 退出bc
一,bc
if [ `echo "0.5 > 0.3" | bc` -eq 1 ]; then echo "ok"; else echo "not ok"; fi;
二,awk
x=3.1; y=3.2; echo "$x $y" | awk '{if ($1 > $2) print $1; else print $2}'
-eq 等于,如:if [ "$a" -eq "$b" ]
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))
字符串比较
= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ],与=等价
-n 字符串不为"null"