shell编程-运算符

shell编程-运算符

运算符号

常用运算符号

+:加
echo $((1+254))
-:减
echo $((26-24))
*:乘
echo $((11*3))
/:除
echo $((21/3))
%:取余
echo $((9%2))
++:自增
--:自减

余数的使用

## 1.使用RANDOM取随机数
[root@zabbix01 ~]# echo $RANDOM
27899

## 随机数的范围是 :man bash 可以查到 0 and 32767 总共32768个数
## 但是有时候,我想在一个范围内随机,例如,咱们班有100个学生,我想在100内随机抽取一名幸运观众。
## 那么就需要使用取余的方式来完成了。

[root@zabbix01 ~]# echo $((RANDOM%10))
9
[root@zabbix01 ~]# echo $((RANDOM%10))
7
[root@zabbix01 ~]# echo $((RANDOM%10))
5
[root@zabbix01 ~]# echo $((RANDOM%10))
4
[root@zabbix01 ~]# echo $((RANDOM%10))
9
[root@zabbix01 ~]# echo $((RANDOM%10))
8
[root@zabbix01 ~]# echo $((RANDOM%10))
6

# 随机抽同学脚本
#!/bin/bash

read -p '请输入滚动次数' count
clear

for ((i=1;i<=$count;i++))
do
        line=$(cat /root/stu.txt | wc -l)
        num=$((RANDOM%$line+1))
        stu=`sed -n "${num}p" stu.txt`
        sleep 0.1
        printf "$stu \r"
done
 username=$(sed -n "${num}p" stu.txt)
 echo -e 这次回答问题的是: "\033[32m $username \033[0m" 同学

## 
echo $((RANDOM%15))
最多到14
0~14

所以需要在后面+1才能随机到最后一个同学

##
sed -n '2p' /etc/passwd
将/etc/passwd的第二行打印出来

##
printf "$stu \r"
把stu这个变量格式化打印出来 \r是回车

##
sleep 0.1
反应时间 0.1

自增

  • 一般开发使用
for(i=1;i++;i<=10){
}
i=1 1
i++ i=i+1
i-- i=i-1

# 自增试验脚本(开发)
[root@web02 ~]# cat zz.sh 
for ((i=1;i<=10;i++));do
    echo $i
done
[root@web02 ~]# sh zz.sh 
1
2
3
4
5
6
7
8
9
10

# 自增脚本(运维)
[root@web02 ~]# cat zz.sh 
#for ((i=1;i<=10;i++));do
#    echo $i
#done

for n in `seq 10`;do
    echo $n
done
[root@web02 ~]# sh zz.sh 
1
2
3
4
5
6
7
8
9
10

逻辑符号

常用逻辑符号

&&:且,前面的命令执行成功后,再执行后面的命令,前面的不成功,则后面的也不执行

||:或,前面的命令执行不成功,才能执行后面的命令,前面的成功,则后面的不执行

!:非,取反

所有符号

符号 作用
+、- 加号,减号,一般用于整型、浮点型等类型的运算,其他语言中也可以做字符串的拼接
*、/、% 乘号、除号、取余,一般用于运算
** 幂运算
++、-- 自增、自减,可前置也可后置,默认步长为1
&&、||、! 且、或、非
<、<=、>= 、> 小于、小于等于、大于等于、大于
==、!=、= 等于,可用于数字和字符串、不等于、赋值
<<、>> 向左位移、向右位移
~、|、&、^ 按位取反、按位异或、按位与、按位或
+=、-+、*=、/=、%= 赋值运算:a+=1 即 a=a+1 ... 依次类推
+ -
整型 浮点型等等的运算 其他语言也可以做字符串的拼接
--------------------------------------------------------
乘号、除号、取余,一般用于运算
--------------------------------------------------------
** 几的几次方

2三次方
2**3
2的10次方 1024
[root@web02 ~]# echo $((2**20))
1048576
-------------------------------------------------------
++ --
n++ n=n+1
n-- n=n-1
n=n+2
-------------------------------------------------------
&&、||、!
逻辑运算
-------------------------------------------------------
<、<=、>= 、>
<
>
<=
>=
<> /!= 不等于
-------------------------------------------------------
==、!=、=
== 用于字符串和数字
!= 不等于
= 赋值
-------------------------------------------------------
<<、>>
-------------------------------------------------------
~、    |、    &、   ^
取反 按位异或 按位与 按位或
-------------------------------------------------------
+=、-+、*=、/=、%=
n=n+2 n+=2
赋值运算

shell里的运算方式

(())

[root@web02 ~]# echo $((5*9))
45

# 不支持非整型

let

[root@web02 ~]# let a=5+7
[root@web02 ~]# echo $a
12

# 不支持非整型

expr

[root@web02 ~]# expr 1 + 5
6

# 不支持非整型

bc

[root@web02 ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
4+8
12
^C
(interrupt) Exiting bc.
[root@web02 ~]# echo 1+8|bc
9
[root@web02 ~]# echo 26/5|bc
5
[root@web02 ~]# echo 26/5|bc -l
5.20000000000000000000

awk

[root@web02 ~]# awk 'BEGIN{print 1+2}'
3
[root@web02 ~]# awk 'BEGIN{print 3+2}'
5
[root@web02 ~]# awk 'BEGIN{print 26/5}'
5.2
[root@web02 ~]# awk 'BEGIN{print 1+2,26/5,3+9}'
3 5.2 12

作业1

1.首先传递两个参数(2个数字)

2.传少了报错

3.传的不是数字也报错

4.计算出传递的两个参数的

  • +

  • -

  • *

  • /

  • %

#!/bin/bash
num1=$1
num2=$2
if [ "$#" -ne 2 ];then
        echo "错误啦:参数个数不对哦,请传递两个数字作为参数。"
        exit 1
fi
[[ re =^[0-9]+$|^[0-9]+\.[0-9]+$ ]]
if ! [[ $1 =~ $re && $2 =~ $re ]];then
        echo "错误啦:可不可以用数字啊。"
        exit 1
else
echo "$num1 + $num2 = `expr $num1 + $num2`"
echo "$num1 - $num2 = `expr $num1 - $num2`"
echo "$num1 x $num2 = `expr $num1 \* $num2`"
if [ "$2" -eq 0 ];then
        echo "被除数不能为零哦"
        exit 1
fi

echo "$num1 ÷ $num2 = `expr $num1 / $num2`"
echo "$num1 % $num2 = `expr $num1 % $num2`"
fi
#!/bin/bash
num1=$1
num2=$2

[ $# -ne 2 ] && {
  echo '请输入两个参数'
  exit 1
} || {
  expr $num1 + $num2 + 1 &>/dev/null
  [ $? -ne 0 ] && {
    echo '请输入两个整数'
    exit
  }||{
      echo "$num1 + $num2 = `expr $num1 + $num2`"
      echo "$num1 - $num2 = `expr $num1 - $num2`"
      echo "$num1 x $num2 = `expr $num1 \* $num2`"
      #echo "$num1 ÷ $num2 = `expr $num1 / $num2`"
      #echo "$num1 % $num2 = `expr $num1 % $num2`"
  }&& {
      [ $num2 -eq 0 ] &&{
        echo '除数不能为0'
      } || {

      echo "$num1 ÷ $num2 = `expr $num1 / $num2`"
      echo "$num1 % $num2 = `expr $num1 % $num2`"
      }
  }
}
num1=$1
num2=$2

[ $# -eq 2 ] &&{
        [[ $num1 =~ ^[0-9]+$|^[0-9]+\.[0-9]+$ ]] && [[ $num2 =~ ^[0-9]+$|^[0-9]+\.[0-9]+$ ]] && {
                [ $num2 != '0' ] && {
                        echo "$num1 + $num2" = `awk -v a=$num1 -v b=$num2 "BEGIN{print a + b}"`
                        echo "$num1 - $num2" = `awk -v a=$num1 -v b=$num2 "BEGIN{print a - b}"`
                        echo "$num1 x $num2" = `awk -v a=$num1 -v b=$num2 "BEGIN{print a * b}"`
                        echo "$num1 ÷ $num2" = `awk -v a=$num1 -v b=$num2 "BEGIN{print a / b}"`
                        echo "$num1 % $num2" = `awk -v a=$num1 -v b=$num2 "BEGIN{print a % b}"`
                }||{
                        echo '除数不能为0'      
                }
        }|| {
                echo '不能输入字母或者特殊符号'
}|| {
        echo '请输入两个整数'
        }
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇