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

  • 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. dea死锁处理和大事务处理

    死锁处理流程: show full processlist; # 获得当前所有数据库连接 select id, db, user, host, command, time, state, info f ...

  2. F. Cowmpany Cowmpensation dp+拉格朗日插值

    题意:一个数,每个节点取值是1-d,父亲比儿子节点值要大,求方案数 题解:\(dp[u][x]=\prod_{v}\sum_{i=1}^xdp[v][i]\),v是u的子节点,先预处理出前3000项, ...

  3. ng-zorro-mobile中遇到的问题

    一.Modal(弹出框)使用上的问题 在官方文档中,Modal是这样使用的: 这里需要注意的一点就是,看到上方代码中只用了Modal的全局方式,所以个人认为下面这段注入初始化的东西是没有用的便去掉: ...

  4. EF Code First数据库连接配置

    前面几节,使用的都是通过EF Code First创建的新数据库,接下来,将开始使用已存在的数据库. 1.使用配置文件设置数据库连接 App.config 数据库连接字符串的name与Data中Nor ...

  5. Android基础控件SeekBar拖动条的使用

    1.简介 SeekBar继承ProgressBar,相关属性和三种不同状态下的触发方法: <!--<SeekBar--> <!--android:layout_width=&q ...

  6. ES6之主要知识点(七)对象

    1.属性的简洁表示法 ES6 允许直接写入变量和函数,作为对象的属性和方法.这样的书写更加简洁. function f(x, y) { return {x, y}; } // 等同于 function ...

  7. 解决mysql因内存不足导致启动报错

    报错如下所示: 解决方案: nano /etc/my.cnf 添加如下设置: key_buffer=16K table_open_cache=4 query_cache_limit=256K quer ...

  8. [转]WPF--模板选择

    典型的,把模板关联到一块特定的数据上,不过通常希望动态的确定使用哪个模板---既可以基于一个属性值,也可以是一个全局状态.当真正需要大规模替换模板时,也可以使用DataTemplateSelector ...

  9. [转]8天玩转并行开发——第二天 Task的使用

    在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于 “任务的编程模型”所冲击,因为task会比thread具有更小的性能开销,不 ...

  10. c++容器的操作方法总结

    一.map 1.创建 typedef map<int,string> descrbe_map_; descrbe_map_ devMap; 或者 map<string,string& ...