shell二之条件检测与数学运算

Posted 遙遙背影暖暖流星

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、在双括号结构中,所有变量可以不加入∶“ ((12)):1c:a++ba++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二之条件检测与数学运算的主要内容,如果未能解决你的问题,请参考以下文章

if 判断语句与shell运算

Shell脚本数学运算

java(

Shell中条件判断语法与判断条件

shell之算数运算符逻辑运算符关系运算符布尔运算符文件测试运算符

shell与shell script