天天看点

Linux系统Bash(Shell)基础知识(3)

  在shell脚本编程中算术运算无疑是十分重要的;

  bash中执行整数算数运算的命令是let,其语法格式为:

  let arg...

  arg为单独的算术表达式如+,-,*,/,%,^等所构成的完整的算术表达式;

  其中^为平方运算,如2^3表示2的三次方;

  let命令可以使用如下方式替代:

  ((算术表达式))

  例如

  [root@localhost wjq]# let "a=2*3"

  [root@localhost wjq]# echo $a

  6

  [root@localhost wjq]# (("a=3*3"))

  9

  除了简单的加减乘除运算,算术运算中还包括增强型运算方式和特殊的增强型运算方式;

  增强型运算方式:

  +=:如a+=b-->a=a+b

  -+:如a-=b-->a=a-b

  *=:如a*=b-->a=a*b

  %=:如a%=b-->a=a%b

  /=:如a/=b-->a=a/b

  转化为let命令运算为:

  [root@localhost wjq]# b=5

  [root@localhost wjq]# let "a+=b"

  14

  [root@localhost wjq]# 

  特殊增强型运算:

  a++:a先将值赋给变量,再+1;

  ++a:a先+1,再将值赋给变量;

  a--:a先将值赋给变量,再-1;

  --a:a先-1,再将值赋给变量;

  转化为let命令的运算方式为:

  [root@localhost wjq]# a=4

  [root@localhost wjq]# let "a++"

  10

  算术运算方法:

  ① let VAR=算术表达式

    #let “B=5+4”

    #echo $B

    将算术表达式先行进行算术运算,并将运算得到的结果保存到变量VAR;

    变量:存储数据的容器

    弱变量:弱类型变量,默认是字符型变量,数值型(不包括浮点型)

  ② VAR=$[算术表达式]

  [root@localhost wjq]# a=$[a*b]

  50

  ③ VAR=$((算术表达式))

  算术表达式中如果有引用就用$引用,也可以省略

  [root@localhost wjq]# a=$((a*b))

  250

  ④ exper ARGU1 ARGU2 ARGU3

          ARGU1和ARGU3 必须是数值

          ARGU2是运算符

  ⑤ echo “算术表达式” | bc(bc命令相当于计算器)

  [root@localhost wjq]# echo "3*4" | bc

  12

 条件测试语句:

  条件测试有三种测试语句

  一是test命令;

  二是用一堆方括号将其括起来,而这是完全等价的;

  test -f "/etc/passwd" 完全等价于 [ -f "/etc/passwd" ]

  三是[[条件表达式]];

  这三种表达式可以和多种系统运算符结合使用,这些系统运算符可以分为四类:数值测试运算符,字符串测试运算符,文件状态测试运算符,逻辑测试运算符;

  下列四种运算符皆在此使用第二种表达方式表示;

  数据测试运算符:使用双目操作符进行运算;

  [ n1 -eq n2 ]:测试n1和n2是否相等,相等为真,不等为假

  [ n1 -ne n2 ]:测试n1和n2是否不相等,不等为真,相等为假;

  [ n1 -lt n2 ]:测试的n1和n2,左边的是否小于右边的,小于为真,大于为假;

  [ n1 -gt n2 ]:测试的n1和n2,左边的是否大于右边的,大于为真,小于为假;

  [ n1 -le n2 ]:测试的n1和n2,左边的是否小于等于右边的;

  例

  [root@localhost wjq]# [ "$a" -eq 0 ] && echo "a等于0" || echo "a不等于0"

  a不等于0

  字符串测试运算符:

  使用单目运算符进行操作;

  -z ‘n1’:如果字符串长度为0,则测试条件为真;

  -n ‘n1’:如果字符串长度不为0;非空为真,空为假;

  [root@localhost wjq]# a='string'

  [root@localhost wjq]# [ -z "$a" ] && echo "a等于0" || echo "a不等于0"

  使用双目运算符进行操作:

  ==|=:被测试的两个字符串是否相等,相同为真,不同为假;

  !=:被测试的两个字符是否不相同,不同为真,相同为假;

  >:被测试的两个字符串在转化为ascll码后的二进制数据;左边是否大于右边,大于为真,小于为      假;

  >:被测试的两个字符串在转化为ascll码后的二进制数据,左边是否小于右边,小于为真,大于为      假;

  ①

  [root@localhost wjq]# b='string'

  [root@localhost wjq]# [ "$a" == "$b" ] && echo "a等于b" || echo "a不等于b"

  a等于b

  ②

  [root@localhost wjq]# b='str'

  [root@localhost wjq]# [ "$a" != "$b" ] && echo "a不等于b" || echo "a等于b"

  a不等于b

  ③

  [root@localhost wjq]# [ "$a" > "$b" ] && echo "a大于b" || echo "a小于b"

  a大于b

  文件状态测试运算符:单目测试运算符;

  文件存在性测试,如果测试的文件存在为真,不存在为假;

  -a|-e:

  [root@localhost wjq]# [ -a ./8yu ] && echo "文件存在" || echo "文件不存在"

  文件存在

  文件类型测试(测试存在性)

  -b file:若文件存在并且为块设备,则测试为真;

  -c file:若文件存在并且为字符设备,则测试为真;

  -d file:若文件存在并且为目录设备,则测试为真;

  -f file:若文件存在并且为文本文档,则测试为真;

  -h|-L file:若文件为存在并且为符号链接文件,则测试为真;

  -p file:若文件存在并且为套接字文件,则测试为真;

  [root@localhost wjq]# [ -f ./8yu ] && echo "文件为文本文档" || echo "文件不是文本文档"

  文件为文本文档

  文件的访问权限设置:

  -r file:若文件存在并且是用户可读,则测试为真;

  -w file:若文件存在并且是用户可写,则测试为真;

  -x file:若文件存在并且是用户可执行的,则测试为真;

  [root@localhost wjq]# [ -r ./8yu ] && echo "文件可读" || echo "文件不可读"

  文件可读

  [root@localhost wjq]# [ -w ./8yu ] && echo "文件可写" || echo "文件不可写"

  文件可写

  [root@localhost wjq]# [ -x ./8yu ] && echo "文件可执行" || echo "文件不可执行"

  文件可执行

  文件特殊权限标识测试:

  -u file:若文件存在并且设置了SUID权限,则测试为真;否则为假;

  -g file:若文件存在并且设置了SGID权限,则测试为真;否则为假;

  -k file:若文件存在并且设置了sticky权限,则测试为真;否则为假;

  [root@localhost wjq]# [ -u ./8yu ] && echo "文件存在SUID权限" || echo "文件不存在SUID权   限"

  文件不存在SUID权限

  [root@localhost wjq]# [ -g ./8yu ] && echo "文件存在SGID权限" || echo "文件不存在SGID权   限"

  文件不存在SGID权限

  [root@localhost wjq]# [ -k ./8yu ] && echo "文件存在STICKY权限" || echo "文件不存在     STICKY权限"

  文件所有权测试:

  -O file:若文件存在并且其属主为当前有效用户,则测试为真;否则为假;

  -G file:若文件存在并且其属组是为当前有效用户,则测试为真;否则为假;

  [root@localhost wjq]# [ -O ./8yu ] && echo "文件存在且其属主为当用户" || echo "文件不存   在"

  文件不存在

  [root@localhost wjq]# ls ./8yu

  ./8yu

  [root@localhost wjq]# ls -l ./8yu

  -rwxrw-r--. 1 wjq wjq 71 3月  27 20:39 ./8yu

  文件内容是否为空:

  -s file:若文件存在并且内容不为空,存在且内容不为空则为真;否则为假;

  时间戳测试:

  -N file:被测试文件自从上一次被修改之后,是否被修改过;

  逻辑测试运算符:

  ① !:逻辑非(NOT),他放在任何表达式前,是原来为真的表达式变为假,使原来为假的表达式变为真;

  ② -a:逻辑与(AND),他放在两个逻辑表达式之间,仅当两个都为真时,结果才为真;

  例:

  [ -f ./8yu -a -f ./aa ]

  ③ -o:逻辑或(OR),他放在两个逻辑表达式中间,其中只要有一个为真,结果才为真;

  [ -f ./8yu -o -f ./aa ]

  两种表达式等价:

  第一种表达式:

  [ -O /tmp/test ] && [ -s /tmp/test ]

  [ -O /tmp/test ] || [ -s /tmp/test ]

  第二种表达式:

  [ -O /tmp/test -a -s /tmp/test ]

  [ -O /tmp/test -o -s /tmp/test ]

  [ ! -O /tmp/test ]

本文转自 wujunqi1996 51CTO博客,原文链接:http://blog.51cto.com/12480612/1917899

继续阅读