shell二之条件检测与数学运算
Posted 遙遙背影暖暖流星
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell二之条件检测与数学运算相关的知识,希望对你有一定的参考价值。
shell第二部分
一、数学运算符
1、expr
expr 只支持整数的基本运算,不支持小数和乘方等运输,乘除*/号,还要加上转义符\\
[root@localhost ~]# expr 5 + 2 //注意空格
7
[root@localhost ~]# expr 5 - 2
3
[root@localhost ~]# expr 5 \\* 2
10
[root@localhost ~]# expr 5 \\/ 5 //非整除时只取整数得数
1
[root@localhost ~]# expr 5 \\/ 2 //非整除时只取整数得数
2
[root@localhost ~]# expr 5 % 5 //除,取余数
0
2、$(( )) 双括号计算
格式∶
(
(
表
达
式
1
,
表
达
2
)
)
特
点
:
1
、
在
双
括
号
结
构
中
,
所
有
表
达
式
可
以
像
c
语
言
一
样
,
如
:
a
+
+
,
b
−
−
等
。
a
+
+
等
价
于
a
=
a
+
12
、
在
双
括
号
结
构
中
,
所
有
变
量
可
以
不
加
入
∶
“
((表达式1,表达2)) 特点: 1、在双括号结构中,所有表达式可以像c语言一样,如: a++,b--等。a++等价于a=a+1 2、在双括号结构中,所有变量可以不加入∶“
((表达式1,表达2))特点:1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b−−等。a++等价于a=a+12、在双括号结构中,所有变量可以不加入∶“”符号前缀
3、双括号可以进行逻辑运算,四则运算
4、双括号结构扩展了for , while, if 条件测试运算
5、支持多个表达式运算,各个表达式之间用“,”分开
在数学是常echo 输出结果,只支持整数
[root@localhost ~]# echo $((2+5*2)) //可以不用加空格和转义符号
12
[root@localhost ~]# echo $((2%10))
2
[root@localhost ~]# echo $((2/10)) //取整数
0
echo $(($RANDOM%3)) //随机并除以3取余数
3、乘方的计算
echo $((2**10))
1024
或者
let a=2**10
echo $a
1024
或者利用bc调用计算器,和echo结合输出结果
echo "2^10" | bc
2024
4、" " | bc
“ " |bc调用计算器不经可以算乘方,还能计算小数
echo "scale=3;8/5" | bc //计算小数时,scale规定小数的个数,注意分号隔开
1.600
5、let 累加累减
sum=0
for i in {1..100}
do
if [ $((i%2)) -eq 0 ] ;then
let sum=$(($i+$sum))
fi
done
echo $sum
二、重定向与管道符号
1、重定向
(1)< 从文件中读取
mysql - uroot - p123456< xuegod. sq // 重定向导入数据库
cat < 文件.text
(2) > 覆盖保存到文件 (正确时才会执行)
将显示在屏幕上的东西 覆盖保存到文件 (正确时才会执行)
echo ”123456 “ > 1.tex
cat 2.tex > 1.tex
(3)>> 追加。在文件尾部继续保存
echo "23456 " >> 1.tex //两个>之间没用空格
cat 2.tex >> 1.tex
echo "123456" >> passwd --stdin 用户名 //无交互改密码
(4) 2> 和2>>
将执行错误的信息覆盖保存或者追加保存到文件中(只在出现错误时执行)
[root@localhost ~]# wq
bash: wq: 未找到命令...
[root@localhost ~]# wq 2> 1
[root@localhost ~]# cat 1
bash: wq: 未找到命令...
[root@localhost ~]# wq 2>> 1
[root@localhost ~]# cat 1
bash: wq: 未找到命令...
bash: wq: 未找到命令...
(5)>& 混合输入
正确和错误都保存
ll >> /dev/null //将结果丢入垃圾桶中
把/dev/null看作"黑洞”,所有写入它的内容都会永远丢失.而尝试从它那儿读取内容则什么也读不到。然而/dev/null对命令行和脚本都非常的有用;
还有的,/dev/zero在类UNIX操作系统中,/dev/zero是一个特殊的文件,当你读它的时候,它会提供无限的空字符(NULL.ASCI NUL,Ox00)。典型用法是用它来产生一个特定大小的空白文件。
dd if=/ dev / zero of=b.txt bs=1M count=50
(6)拓展 << 和 eof 的用法
eof, 也可自定义其他的的字符串,当交互内容再次出现相同的efo 则会停止输入(即起了起止符的作用),过程中的内容汇入文件中
cat > 1.text << eof //cat > >1.text << eof 内容则为追加形式存入
[root@localhost ~]# cat > 1.text << eof
> 1
> 2
> 5
> 6
> eof
[root@localhost ~]# cat 1.text
1
2
5
6
(7)tee命令的使用
即可以显示查看,又能输入到文件中保存(覆盖),-a 则追加
例1∶将磁盘使用的信息写入文件
df -h | tee disk.log
例2∶将文件系统使用的信息追加到文件
df -h | tee -a disk.log-
2、管道符
1、管道命令只处理前一个命令正确输出,不处理错误输出·
2、管道右边的命令,必须能够接收标准输入的数据流命令才行
·3、管道符可以把两条命令连起来,它可以链接多个命令使用
三、位置变量介绍
$0 当前边环境
$1 执行脚本时,后面第一个参数为$1
$2 执行脚本时,后面第二个参数为$2
…
四、预定义变量介绍
1、预定义变量是由Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。预定义变量使用“$”符号和另一个符号组合表示
$#:表示命令行中位置参数的个数。
$*:表示所有位置参数的内容,这些内容当做一个整体
$@:表示列出所有位置参数,但是是以单个的形式的列出
$?:表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。
$0:表示当前执行的脚本或程序的名称
$$:表示返回当前进程的进程号
$!:返回最后一个后台进程的进程号
五、shell条件检测
1、条件检测
(1)测试表达式是否成立,若成立返回0,否则返回其他数值 。通常用$?是否等于零
格式1: test 条件表达式
格式2:[条件表达式]
分类:
a、文件测试
b、整数测试
c、字符串测试
(2)&& 和||
a、在[ 条件判断 ] 后面,&& 前面条件为是时执行,|| 条件为否时才执行
b、在两个[ 条件判断 ] 中中间,表示且和或
[条件表达式1] $$ [条件表达式2] ,则表且的意思
[条件表达式1] $$ [条件表达式2] ,则表或的意思
c、[ 条件1 -a 条件2 ] 以及 [ 条件1 -o 条件2 ] 也能表示且和或
if [ $score -lt 0 -o $score -gt 100 ]; then
echo "超过范围无法判断"
2、检测字符
(1)检测字符串是否为空[ -z ] ,真时$? 为0
(2)检测字符串是否为非空[ -n ],真时$? 为0
3、整数值测试
-eq:第一个数等于(Equal)第二个数。
-ne:第一个数不等于(Not Equal)第二个数。
-gt:第一个数大于(Greater Than)第二个数。
-lt:第一个数小于(Lesser Than)第二个数。
-le:第一个数小于或等于(Lesser or Equal)第二个数。
-ge:第一个数大于或等于(Greater or Equal)第二个数
4、文件类型测试
d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File) 。
-L:测试是否为链接文件-
b:测试是否为设备文件
-c:测试是否为字符设备文件
-r:测试当前用户是否有权限读取(Read).
-w:测试当前用户是否有权限写入(Write)
-x:测试是否设置有可执行(Excute)权限-s:测试存在且文件大小为空
1、思考题:输入一个年份,判断是否是闰年(如果是就打印是闰年,否则打印不是闰年)
#!/bin/bash
read -p "请输入年份:" year
a=$(($year%4))
b=$(($year%400))
c=$(($year%100))
if [ $b -eq 0 ];then
echo "$year 年是闰年"
fi
if [ $b -ne 0 ] && [ $c -eq 0 ];then
echo "$year 年不是闰年"
fi
if [ $a -eq 0 ] && [ $c -ne 0 ];then
echo "$year 年是闰年"
fi
2、#判断目标主机是否存活,存活就打印is up,如果不存活就打印is down
#
#!/bin/bash
read -p "请输入主机ip :" name
ping -c 5 $name $>/dev/null
[ $? == 0 ] && echo "$name is up" || echo "$name is down"
3、#判断输入的用户名是否存在,存在提示已存在,不存在则创建用户并设置密码
#!/bin/bash
read -p "请输入用户名:" name
id $name >& /dev/null
if [ $? -ne 0 ] ;then
useradd $name
read -p "新用户名,输入密码:" mima
echo $mima > passwd --stdin $name
else
echo "用户已存在"
fi
~
4、#判断当前登陆用户是否是管理员
#!/bin/bash
user=$( whoami )
l=`id $user | grep root`
[ -n "$l" ] && echo "当前用户为管理者" || echo "当前为非管理用户"
5、
#!/bin/bash
user=`whoami`
dname=`pwd`
zhuji=`hostname`
jincheng=` ps -aux |wc -l`
yonghu=` who |wc -l`
time=`date +%Y年%m月%d日-%H:%M:%S`
clear
echo ---------------------------------------------------------------------
echo "# System Info Table # "
echo -e "\\e[1;34m# 当前登录用户为: $user \\e[3;60H#\\e[0m"
echo -e "\\e[1;31m# 当前登录目录为: $dname \\e[4;60H#\\e[0m"
echo -e "\\e[1;33m# 当前登录主机为: $zhuji \\e[5;60H#\\e[0m"
echo -e "\\e[1;32m# 当前登录系统时间为: $time \\e[6;60H#\\e[0m"
echo -e "\\e[1;34m# 当前系统运行进程数为: $jincheng \\e[7;60H#\\e[0m"
echo -e "\\e[1;33m# 当前系统登录的用户数: $yonghu \\e[8;60H#\\e[0m"
echo -e "\\e[1;35m# #任何问题请联系: 139139139139 \\e[9;60H#\\e[0m"
echo ---------------------------------------------------------------------
#当前登录目录为:
#当前登录主机为:
#当前登录系统时间为:
#当前系统运行的进程数:
#当前系统登录的用户数:
#任何问题请联系: 139139139139
以上是关于shell二之条件检测与数学运算的主要内容,如果未能解决你的问题,请参考以下文章