+, -, *(乘), /(除), **(乘方), %(取模)

  • let var=算术运算符表达式

    高级let用法:let i+=2

    +=,-=,*=,/=,%=,**=

    自增:let var++

  • var=$[算术运算符表达式]

  • var=$((算术运算符表达式))

  • var=$(expr $ARG1 OP $APG2)

</font color=red>注意:乘法符号在某些场景中需要使用转义符

练习1:写一个脚本文件,完成如下功能:添加3个用户,求这3个用户的UID之和。

#!/bin/bash

id testUser1 > /dev/null || useradd testUser1
id testUser2 > /dev/null || useradd testUser2
id testUser3 > /dev/null || useradd testUser3 uid1=`grep "testUser1" /etc/passwd | cut -d: -f3`
uid2=`grep "testUser2" /etc/passwd | cut -d: -f3`
uid3=$(grep "testUser3" /etc/passwd | cut -d: -f3) #方法1
#let num=$uid1+$uid2+$uid3
#方法2
#num=$[$uid1+$uid2+$uid3]
#方法3
num=$(($uid1+$uid2+$uid3))
#方法4
#num=$(expr $uid1 + $uid2 + $uid3)
echo $num

练习2:写一个脚本文件,完成如下功能:求/etc/passwd文件中第10行和第20行的用户的UID之和

#!/bin/bash

#先用head取前10行,再用tail取最好一行,然后再用cut切
la=`head -10 /etc/passwd | tail -1 | cut -d: -f3`
lb=`head -20 /etc/passwd | tail -1 | cut -d: -f3` echo $la
echo $lb let lc=$la+$lb
echo $lc

练习3:写一个脚本文件,完成如下功能:求/etc/passwd文件中,uid最大的2个uid之和

#!/bin/bash

#先用冒号把文件分成多列,用第三列从大到小排序后,分别取第一行和第二行,最后在用cut切开
la=`sort -t: -k3 -nr /etc/passwd | head -1 | cut -d: -f3`
lb=`sort -t: -k3 -nr /etc/passwd | head -2 | tail -1 | cut -d: -f3` echo $la
echo $lb let lc=$la+lb
echo $lc

练习4:写一个脚本文件,完成如下功能:通知2个文件里的空白行数之和

#!/bin/bash

#用grep找出空白行(使用正则表达式),然后再用wc数一数有多少行
la=`grep -e "^[[:space:]]*$" /etc/rc.d/init.d/functions | wc -l`
lb=`grep -e "^[[:space:]]*$" /etc/inittab | wc -l` echo $la
echo $lb let lc=$la+$lb
echo $lc

条件语句

测试表达式:

  • test expression
  • [ expression ]
  • [[ expression ]]

注意:中括号中间的空格,没有空格就是语法错误

bash的条件测试类型

  • 数值比较大小

    • -eq:等于 [ $num1 -eq $num2 ]
    • -ne:不等于[ $num1 -ne $num2 ]
    • -gt:大于[ $num1 -gt $num2 ]
    • -ge:大于等于[ $num1 -ge $num2 ]
    • -lt:小于[ $num1 -lt $num2 ]
    • -le:小于等于[ $num1 -le $num2 ]

    例子:[ 2 -ne 3 ]和test 2 -ne 3效果一样

    #!/bin/bash
    
    if [ 2 -ne 3 ]; then
    echo 11
    else
    echo 22
    fi if test 2 -ne 3; then
    echo 111
    else
    echo 222
    fi
  • 字符串比较

    == :等于

    > :大于

    < :小于

    != :不等于

    =~ :左侧字符串是否被右侧的正则表达式所匹配。

    -z "STRING" :指定字符串为空则为真

    -n "STRING":指定字符串不为空则为真

    做字符串比较的变量,最好加上“”。不加的话,如果做比较的某个变量没有被定义的话,执行就会出错。

    下面的例子,tom是不存在的变量,不加括号就出错误了,加了就没有错误。

    $ [ tom = $tom ]
    -bash: [: tom: unary operator expected
    $ [ tom = "$tom" ]
    $ echo $?
    1

    字符串比较,最好要用[[]]。

    下面的例子,说明了用[]无法比较

    $ [ a > b ]
    $ echo $?
    0
    $ [ a < b ]
    $ echo $?
    0
    $ [ "a" < "b" ]
    $ echo $?
    0
    $ [ "a" > "b" ]
    $ echo $?
    0

    下面的例子,说明用[[ ]]达到了预期。

    $ [[ a < b ]]
    $ echo $?
    0
    $ [[ a > b ]]
    $ echo $?
    1
    $ [[ "a" > "b" ]]
    $ echo $?
    1
    $ [[ "a" < "b" ]]
    $ echo $?
    0

    字符串空的判断:

    $ [[ -z "$tom" ]]
    $ echo $?
    1
    [ys@localhost ~]$ [[ -n "$tom" ]]
    [ys@localhost ~]$ echo $?

    正则表达式的匹配:

    $ tom=ooo
    [ys@localhost ~]$ [[ $tom =~ o.* ]]
    [ys@localhost ~]$ echo $?
    0
    [ys@localhost ~]$ tom=jerry
    [ys@localhost ~]$ [[ $tom =~ o.* ]]
    [ys@localhost ~]$ echo $?
    1
  • 文件测试

    • 文件存在性检查:-a FILE,或者,-e FILE。存在返回0.

      例子:[ -a /etc/passwd ][ -e /etc/passwd ]

    • 文件存在性和类型检查

      -b FILE:文件存在,且类型是块设备,则返回0.

      -c FILE:文件存在,且类型是字符设备,则返回0.

      -d FILE:文件存在,且类型是目录,则返回0.

      -f FILE:文件存在,且类型是普通文件,则返回0.

      -h或 -L FILE:文件存在,且类型是符号链接,则返回0.

      -p FILE:文件存在,且类型是命名管道,则返回0.

      -S FILE:文件存在,且类型是本地套接字,则返回0.

      $ [ -b /dev/sda ]
      [ys@localhost scripts]$ echo $?
      0
      [ys@localhost scripts]$ [ -b /dev/sdad ]
      [ys@localhost scripts]$ echo $?
      1
      [ys@localhost scripts]$ [ -b 2.sh ]
      [ys@localhost scripts]$ echo $?
      1
    • 文件权限检查

      -r FILE:文件存在,且当前用户(运行此shell进程的用户)可读,则返回0.

      -w FILE:文件存在,且当前用户(运行此shell进程的用户)可写,则返回0.

      -x FILE:文件存在,且当前用户(运行此shell进程的用户)可执行,则返回0.

    • 特殊权限检查

      -u FILE:文件存在,且拥有suid权限,则返回0.

      -g FILE:文件存在,且拥有sgid权限,则返回0.

      -k FILE:文件存在,且拥有sticky权限,则返回0.

    • 文件是否有内容

      -s FILE:文件存在,且有内容,则返回0

    • 时间戳

      -N FILE:文件自从上一次读取操作后,是否被修改过。

    • 从属关系

      -O FILE:当前用户是否文件属主

      -G FILE:当前用户是否在文件属组里。

    • 双目

      FILE1 -ef FILE2:如果FILE1和FILE2是指向同一个文件系统的相同inode的硬链接,则返回0.

      FILE1 -nt FILE2:如果FILE1的修改时间戳新于FILE,则返回0

      FILE 1 -ot FILE2:如果FILE1的修改时间戳旧于FILE,则返回0

组合测试条件

第一种方式:

  • [ expression1 ] && [ expression2 ]
  • [ expression1 ] || [ expression2 ]
  • ! COMMOND

第二种方式:

  • 与运算:[ expression1 -a expression2 ]
  • 或运算:[ expression1 -o expression2 ]

练习:判断主机名称是否为空,或者是否是localhost.localdomain

#!/bin/bash

hostname=`hostname`
if [ -z "$hostname" -o "$hostname" == "localhost.localdomain" ]; then
hostname=11111
else
echo "ng"
fi
echo $hostname

向脚本文件传递执行时候的参数

使用位置参数变量:$1,$2,...${10},${11}.

10之后的参数必须加上{}。

$0:是脚本本身的路径加脚本文件的名字。

$#:是参数的个数

$*:拿到所有参数。但把所有参数汇总成了一个串

$@:拿到所有参数。但没有把参数汇总成一个串。

当执行下面命令后,$1的值就是111;$2的值就是222;$3的值就是333;

$ ./script.sh 111 222 333

shift用法:shift n:踢掉前n个位置参数变量

下面的内容保存在shift.sh中

#!/bin/bash
echo $1 $2
shift 1
echo $1
shift 1
echo $1

执行shift.sh的结果:

# bash shift.sh 111 222 333
111 222
222
333

练习:传递2个文本文件的路径给脚本,计算出空白行数之和。

#!/bin/bash
la=`grep -e "^[[:space:]]*$" $1 | wc -l`
lb=`grep -e "^[[:space:]]*$" $2 | wc -l`
echo $la
echo $lb let lc=$la+$lb
echo $lc

执行结果:

# bash sumforarg.sh /etc/rc.d/init.d/functions /etc/inittab
91
0
91

if语法

if  con1 ; then

elif con2 ; then

else

fi

练习:查看给定用户是否存在,不存在则创建此用户。

#!/bin/bash

if ! grep "^$1\>" /etc/passwd &> /dev/null ; then
useradd $1
# 设定用户$1的密码是111
echo "111" | passwd --stdin $1 &> /dev/null
echo "add user $1 donw!"
fi

练习:比较2个数字的大小

#!/bin/bash

#声明一个变量,是整数。
declare -i max
#参数个数小于2
if [ $# -lt 2 ]; then
echo "at least one argu"
exit 1
fi
#参数1大于参数2
if [ $1 -ge $2 ]; then
max=$1
else
max=$2
fi
echo "max number is $max"

练习:判断给定用户名的id号是奇数还是偶数

#!/bin/bash

if [ $# -lt 1 ]; then
echo "at least one argu"
exit 1
fi #取得用户的id
uid=$(grep "^$1\>" /etc/passwd | cut -d: -f3)
echo $uid #判断奇偶数
if [ $[$uid % 2] -eq 0 ]; then
echo "oushu"
else
echo "jishu"
fi

运行结果:

# bash jigou.sh ys
1000
oushu
# bash jigou.sh fedora
1005
jishu

练习:给2个文本文件路径,如果文件不存在,则结束脚本;都存在则返回每个文件的行数,并找出行数多的文件

#!/bin/bash

if [ $# -lt 2 ]; then
echo "at least two argu"
exit 1
fi if ! [ -e $1 -a -e $2 ]; then
exit 1
else
la=`wc -l < $1`
lb=`wc -l < $2` echo "$1 行数:$la;$2 行数:$lb"
if [ $la -ge $lb ]; then
echo "$1 行数多"
else
echo "$2 行数多"
fi fi

运行结果:

# bash sum1.sh /etc/passwd /etc/fstab
/etc/passwd 行数:56;/etc/fstab 行数:13
/etc/passwd 行数多

case语法

case $var in
pat1) ;;
pat2) ;;
pat3) ;;
*) ;;
esac

pat支持globbing风格:

  • *:匹配任意长度的任意字符
  • ?:匹配任意单个字符
  • []:匹配指定范围内的任意单个字符
  • [^]:匹配指定范围外的任意单个字符
  • {}:表示符合括号内包含的多个文件
  • aaa|bbb:aaa或bbb

执行完脚本文件后,返回值是啥?

默认是脚本文件里最后一条命令的返回值。

可以自定义返回值:使用exit n命令,n为数字。

当shell进程遇到exit命令时,进程会立即终止,因此exit后面的命令就不执行了。

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

linux bash算术运算的更多相关文章

  1. 转: windows 10使用原生linux bash命令行

    转: https://www.zybuluo.com/pandait/note/337430 windows 10使用原生linux bash命令行 linux bash windows-10 第一时 ...

  2. Linux Bash代码 利用for循环实现命令的多次执行

    Linux Bash代码 [yuanhao15@lu01 libsvm-rank-2.81]$ for ((i=0; i<=19; i++)) do ./svm-train -s 5 -c 10 ...

  3. linux BASH shell设置字体与背景颜色

    linux BASH shell下设置字体及背景颜色的方法. BASH shell下设置字体及背景颜色  echo -e "\e[31mtest\e[41m"  \e[30m 将字 ...

  4. Linux:-bash: ***: command not found

    Linux:-bash: ***: command not found,系统很多命令都用不了,均提示没有此命令. 突然之间linux很多命令都用不了,均提示没有此命令. 这应该是系统环境变量出现了问题 ...

  5. Linux Bash命令关于程序调试详解

    转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...

  6. 禁用Linux bash rm --force

    防止无意的Linux bash rm --force 二.禁用rm -rf 因为rm -rf 删除文件的时候,经常会不小心将系统文件或者多个有用的目录删除掉.有两种方法:1,每次删除都用-i(inte ...

  7. linux bash关闭标准输出1(exec 1<&-)后重新打开

    linux bash shell的再次学习. 文件描述符: stdin,stdout 和 stderr 的文件描述符分别是 0,1 和 2(一个文件描述符说白了就是文件系统为了跟踪这个打开的文件而分配 ...

  8. win10开启 linux Bash命令(win10内置了linux系统支持)

    win10开启 Ubuntu linux Bash命令(win10内置了linux系统支持) 第一步: 先在设置→更新和安全→针对开发人员中选择"开发人员模式",点击后会下载&qu ...

  9. 【Linux】linux bash shell之变量替换::=句法、=句法、:-句法、-句法、=?句法、?句法、:+句法、+句法

    linux bash shell之变量替换::=句法.=句法.:-句法.-句法.=?句法.?句法.:+句法.+句法   linux bash shell之变量替换::=句法.=句法.:-句法.-句法. ...

随机推荐

  1. 小米手机 DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs

    手机:小米2s,MIUI 9 7.11.16 开发版 手机已处于开发者模式,启用了USB调试,已使用USB线连接了手机,在Android Studio 工具栏点击 "Run ‘app’(Sh ...

  2. MYSQL批量创建表的存储过程

    因为业务需要,创建了100个表,但是这些表的结构都是一样的,作为程序员,就是要解决这种重复劳动.然而这种事情还要单独写个php脚本的话太麻烦了吧,所以就干脆学了一下直接用Mysql存储过程怎么实现: ...

  3. 郝斌–SQL Server2005学习笔记

    数据库(Database)狭义上是指存储数据的仓库,广义上包含对数据进行存储和管理的软件(DBMS)和数据本身.数据库由表.关系和操作组成. 一.数据库简介 1.为什么需要数据库 数据库简化了对数据的 ...

  4. 01.visual studio 2017添加菜单

    创建项目 文件--新建项目 如果新建项目 左侧没有扩展菜单,请安装即可 添加菜单 右键--添加新项 菜单设置 菜单设置文件: MyCommandPackage.vsct <Buttons> ...

  5. 由VMnet引起的browser-sync故障解决方案

    (2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2016年7月11日) 今天晚上,前端组的小伙伴问我说能不能帮忙看看他的电脑为什么在安装了browser-sync插件以后, ...

  6. Linux文件句柄数配置

    1.单程序句柄数限制 查看配置的句柄数:ulimit -n cat /etc/security/limits.conf 参考配置: * soft nofile 655360* hard nofile ...

  7. 【机器学习】机器学习入门08 - 聚类与聚类算法K-Means

    时间过得很快,这篇文章已经是机器学习入门系列的最后一篇了.短短八周的时间里,虽然对机器学习并没有太多应用和熟悉的机会,但对于机器学习一些基本概念已经差不多有了一个提纲挈领的了解,如分类和回归,损失函数 ...

  8. Spring Cloud Eureka 使用外网IP和端口号进行服务注册

    应用场景如下: 服务提供方(即要注册到服务中心的服务)的内网地址,外界无法访问(或者使用docker等做了应用端口等的配置),做了IP映射后,公网IP49.10.22.106映射到服务提供方的内网ip ...

  9. C语言函数指针和回调函数

    彻底搞定C指针-函数名与函数指针 函数名&函数名取地址 函数指针 通常我们可以将指针指向某类型的变量,称为类型指针(如,整型指针).若将一个指针指向函数,则称为函数指针. 函数名的意义 函数名 ...

  10. python3 新特性

    1.格式化字符串f-string user = "Mike" log_message = f'User{user} has logged in' 2.路径管理库Pathlib 3. ...