目录
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常见的算术运算符号:参见C算术运算符
- 多了一个
**
:幂运算
- 多了一个
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}'