LinuxShellShell数学运算详细讲解
目录
[Linux][Shell][Shell数学运算]详细讲解
目录
0.前置知识
1.if参数
参数 | 意义 |
---|---|
-b | 当 file 存在并且是 块⽂件 时返回 true |
-c | 当 file 存在并且是 字符⽂件 时返回 true |
-d | 当 pathname 存在并且是⼀个 ⽬录 时返回 true |
-e | 当 pathname 指定的 ⽂件或⽬录 存在时返回 true |
-f | 当 file 存在并且是 ⽂件 时返回 true |
-g | 当由 pathname 指定的 ⽂件或⽬录 存在并且 设置了 SGID 位 时返回为 true |
-h | 当 file 存在并且是 符号链接⽂件 时返回 true ,该选项在⼀些⽼系统上⽆效 |
-k | 当由 pathname 指定的 ⽂件或⽬录 存在并且 设置了“粘滞”位 时返回 true |
-p | 当 file 存在并且是 命令管道 时返回为 true |
-r | 当由 pathname 指定的 ⽂件或⽬录 存在 并且可读 时返回为 true |
-s | 当 file 存在 ⽂件⼤⼩⼤于0 时返回 true |
-u | 当由 pathname 指定的 ⽂件或⽬录 存在并且 设置了 SUID 位 时返回 true |
-w | 当由 pathname 指定的 ⽂件或⽬录 存在 并且可执⾏ 时返回 true |
-o | 当由 pathname 指定的 ⽂件或⽬录 存在 并且被⼦当前进程的有效⽤户ID所指定的⽤户拥有时 返回 true |
2.Unix Shell里面比较字符写法
参数 | 意义 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
-z | 空串 |
= | 两个字符相等 |
!= | 两个字符不等 |
-n | 非空串 |
1.算数运算符号
- Shell常见的算术运算符号:参见
- 多了一个
**
:幂运算
- 多了一个
2.常见算数运算命令
0.常用算数运算命令
运算操作符与运算命令 | 意义 |
---|---|
(()) | 用于整数运算,效率很高 |
let | 用于整数运算,类似 (()) |
expr | 可用于整数运算,但还有很多其他额外功能 |
bc | Linux下的一个计算机程序(适合整数及小数运算) |
$[] | 用于整数运算 |
awk | 即可以用于整数运算,也可以用于小数运算 |
declare | 定义变量值和属性, -i 参数可以用于定义整型变量,做运算 |
1.双括号(())
效率极高
注意 :必须是整数,
(())
不支持浮点数,浮点数需要其他命令计算运算操作符与运算命令 意义 ((i=i+1))
运算后赋值,不能用 echo ((i=i+1))
的形式输出表达式的值,要用echo $((i=i+1))
输出i=$((i+1))
在 (())
前加$
,表示将表达式运算后赋值给i
((8>7&&5==5))
进行比较操作,还可以加入逻辑与和逻辑或,用于条件判断 echo $((2+1))
需要直接输出运算表达式的运算结果时,在 (())
前加$
简易Shell脚本示例 :一个交互的计算器
#!/bin/bash Usage() { printf "Error! Please enter an integer\n" exit 1 } # 接收用户输入的命令,-p参数后面写给用户看到的提示信息 read -p "Please input your number> " first # 进行对用户输入判断 --> if语句 # 限制用户必须输入纯数字 # []里面前后必须有一个空格,是固定语法 # -n,如果字符串为空,则条件不成立,如果不为空,则条件成立 # sed的作用是把字符串进行替换,把所有的数字都替换为空,那么就剩下其他的非数组内容了 if [ -n "`echo $first | sed 's/[0-9]//g'`" ] then Usage fi read -p "Please input your operator> " operator if [ "$operator" != "+" ] && [ "$operator" != "-" ] && [ $operator != "*" ] && [ $operator != "/" ] then echo "只允许输入+-*/" exit 2 fi read -p "Please input your number> " second if [ -n "`echo $second | sed 's/[0-9]//g'`" ] then Usage fi echo $(($first $operator $second))
2.let命令
let命令等同于
(())
- 但是
(())
效率更高
- 但是
简易脚本示例 :检测网页状态
#!/bin/bash CheckUrl() { timeout=0 fails=0 success=0 while true do wget --timeout=$timeout --tries=1 snowk.x3322.net:9098 -q -O /dev/null # 如果状态码!=0,就报错 if [ $? -ne 0 ] then let fails+=1 else let success+=1 fi if [ $success -ge 1 ] then echo "It's success :P" exit 0 fi # 如果出错次数大于2,就告警 if [ $fails -ge 2 ] then echo "It's dead :(" exit 2 fi done } CheckUrl
3.expr命令
expr
命令允许在命令行处理数学表达式,简单的计算器命令- 具体用法
:
expr --help
- 具体用法
:
expr
命令并不是很好用,因为其 基于空格传入参数- 很多符号在shell⾥有特殊含义,因此必须得 转义使用
示例
expr 5 + 3 expr 5 * 6
expr
模式匹配:
–> 计算字符串中的字符个数.*
–> 任意字符串重复0次或多次- 此处可以自定义想匹配的内容
- 语法
:
expr 字符串 ":" ".*"
- 示例
:
expr SnowK.jpg ":" ".*jpg"
简单脚本示例 :
expr
判断文件名是否符合要求#!/bin/bash if expr $1 ":" ".*jpg" &> /dev/null then echo "This is a jpg file" else echo "It's not a jpg file" fi
找出字符长度不大于6的单词
#!/bin/bash for str in I am SnowK, this is a example do if [ `expr length $str` -le 4 ] then echo $str fi done
4.bc命令
bc命令可以当作命令行计算器
直接
bc
可以进入交互式操作bc
配合管道符计算:计算1~10的和echo {1..10} | tr " " "+" | bc
5.中括号[]
- 语法
:
$[表达式]
6.awk计算
echo "4 8" | awk '{print $1+4*$2}'