Bash Shell脚本基础-变量类型-位置变量

Bash Shell脚本基础变量类型位置变量

 

§·bash shell脚本编程概述: 1

§·bash shell脚本中的变量 2

    *什么是变量 2

    *变量的类型 2

    *bash  shell变量区别 2

            №1字符型变量: 2

        ·申明 2

        ·赋值 3

        ·运算符 3

        ·条件测试 3

        №2整数型变量: 5

        ·申明: 5

        ·赋值 5

        ·运算符 6

        ·实现算术运算: 7

        ·生成随机数 7

        ·数值条件测试 8

        -gt大于测试: 8

        -ge: 大于等于测试: 8

        -eq: 等于测试: 8

        -ne: 不等于测试: 9

        -lt: 小于测试: 9

        -le: 小于等于测试: 9

        §·位置变量$0  $1  $2  $#  $@  $* 9

◎位置变量: 9

◎举例说明: 10

§·练习题 11

 

 

 

 

 

 

§·bash shell脚本编程概述:

shell脚本编程时过程式的编程语言,由解释器把代码解释执行为机器语言(二进制)

过程式:以指令为中心,数据服务于指令

既然shell是以指令为中心,数据服务于指令,那我们的数据从何而来呢?在shell中数据一般存储于变量和数组中,我们今天就来学习下数据存储变量。

以下我们谈到的变量都为Centos 7.2中的bash shell脚本变量。

§·bash shell脚本中的变量

什么是变量

变量就是一段命名的内存空间(也就是说数据在内存中,重启或关机,该变量和数据都会丢失)

比如:申明一个变量

[root@Centos7 bin]# declare -i number1  #申明一个变量为整数,变量名称为:number1
[root@Centos7 bin]# number1=100  #给变量赋予一个数值
[root@Centos7 bin]# echo $number1  #显示变量的内容
100
[root@Centos7 bin]# set | grep number1  #查找内存中变量的名称及其数值
number1=100

变量的类型

◎变量:变量类型

作用:

1、数据存储格式

2、参与的运算

3、表示的数据范围

类型:

字符

数值:整型、浮点型

在编程语言中基本上就两种变量类型:字符和数值。如果确定了某个变量的类型,就确定了该变量在内存空间的占用的内存空间。

比如:

数据存储格式和数据范围:

申明一个变量A为整数型可能占用内存空间为 1字节(8位),该变量A就确定了数值大小1-256

申明一个变量B为浮点型可能占用内存空间为2字节(16位),该变量B就确定了数值大小为1-65536

参与的运算:

变量A为整数型数据,它参与的运算中不能出现有小数点的数据;

bash  shell变量区别

无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用

Bash shell中变量类型就两类: 字符型与整数型。注意:bash shell 脚本不支持浮点型变量

1字符型变量:

·申明

默认情况下bash shell中变量无需申明,申明和赋值可以一起操作!

·赋值

直接赋值: 直接给变量一个值

[root@Centos7 bin]# var1=1 #变量var1值为1
[root@Centos7 bin]# var2=2 #变量var2值为2
[root@Centos7 bin]# echo $var1 $var2 #显示变量var1 var2 的值
1 2

变量赋值:把其它变量的值给定义的变量

[root@Centos7 bin]# var3="$USER" #把系统变量$USER的值赋给var3
[root@Centos7 bin]# echo $var3  #查看var3的值为原来$USER的值了
Root

命令赋值:把某个命令的结果值给定义的变量

[root@Centos7 bin]# var4=$(date +%F) #把当前系统时间赋值给var4
[root@Centos7 bin]# echo $var4
2016-08-11
[root@Centos7 bin]# var5=`date +%F`  #把当前系统时间赋值给var5
[root@Centos7 bin]# echo $var5
2016-08-11

 注意:命令格式两个都可以正常使用

·运算符

字符串也可以使用 + – * /,但是实际运用中没有自己。

使用 + :

[root@Centos7 bin]# echo $var1 $var2
1 2
[root@Centos7 bin]# var_sum="$var1+$var2"
[root@Centos7 bin]# echo $var_sum #得到的结果为两个字符串简单的链接在一起
1+2

·条件测试

◎字符串测试

==:是否等于;

>: ascii码是否大于ascii码

<: 是否小于

!=: 是否不等于

=~: 左侧字符串是否能够被右侧的PATTERN所匹配

注意: 此表达式一般用于[[ ]]中;

-z "STRING":字符串是否为空,空为真,不空为假

-n "STRING":字符串是否不空,不空为真,空为假

注意:用于字符串比较时的用到的操作数都应该使用引号

·== :相等测试

[root@Centos7 bin]# A=a
[root@Centos7 bin]# B=b
[root@Centos7 bin]# [ $A == $B  ]&&echo "xiangdeng" || echo "budeng"
#如果[ $A == $B  ]相等,执行echo "xiangdeng"命令
#如果[ $A == $B  ]不相等,则执行echo "budeng"
budeng   #$A为a ,$B为b,肯定是不等的
[root@Centos7 bin]# A=b
[root@Centos7 bin]# [ $A == $B  ]&&echo "xiangdeng" || echo "budeng"
xiangdeng  #$A为b ,$B为b,肯定是相等的

 

注:小于< 大于 > 对于字符串比较没有意义,我们就测试下面的.

 

·!= :不相等测试  (这个测试与 == 测试正好是相反的)

[root@Centos7 bin]# A=a
[root@Centos7 bin]# B=b
[root@Centos7 bin]# [ $A != $B  ]&&echo "buxiangdeng" || echo "xiangdeng"
#如果[ $A != $B  ]不相等,执行echo "buxiangdeng"命令
#如果[ $A != $B  ]相等,则执行echo "xiangdeng"
buxiangdeng   #$A为a ,$B为b,肯定是不等的
[root@Centos7 bin]# A=b
[root@Centos7 bin]#[ $A != $B  ]&&echo "buxiangdeng" || echo "xiangdeng"
xiangdeng  #$A为b ,$B为b,肯定是相等的

 

·=~: 左侧字符串是否能够被右侧的PATTERN所匹配

注意:表示右侧的字符串是否包含在左侧的字符串中
[root@Centos7 bin]# [[ 123abc789 =~ 1234  ]] && echo "YES" || echo "NO"
NO                 #(右侧)1234不在  (左侧)123abc789中
[root@Centos7 bin]# [[ 123abc789 =~ 789  ]] && echo "YES" || echo "NO"
YES     #(右侧)789在  (左侧)123abc789中
[root@Centos7 bin]# [[ 123abc789 =~ abc  ]] && echo "YES" || echo "NO"
YES
[root@Centos7 bin]# [[ 123abc789 =~ ABC  ]] && echo "YES" || echo "NO"
NO
[root@Centos7 bin]# [[ 123abc789 =~ 123  ]] && echo "YES" || echo "NO"
YES
[root@Centos7 bin]# [[ 123abc789 =~ 123a  ]] && echo "YES" || echo "NO"
YES
[root@Centos7 bin]# [[ 123abc789 =~ 1123a  ]] && echo "YES" || echo "NO"
NO

 

 

2整数型变量:

·申明:

declare -i var=数值

declare -i var=1  #声明与赋值一起

[root@Centos7 bin]# declare -i var=1
[root@Centos7 bin]# echo $var
1

·赋值

直接赋值:declare -i var ; var=1

增强型赋值:

+=, -=, *=, /=, %=

+= 例如:let count+=3 自加3后自赋值(变量先前的值加上3赋给现在的变量)

[root@Centos7 bin]# let count+=3 #默认情况下 count为空,赋值后为3
[root@Centos7 bin]# echo $count  #显示变量count当前值
3
[root@Centos7 bin]# let count+=3 #给count在赋值,在原来基础上加3就为6
[root@Centos7 bin]# echo $count 
6
[root@Centos7 bin]# let count+=3
[root@Centos7 bin]# echo $count
9
[root@Centos7 bin]# let count+=3
[root@Centos7 bin]# echo $count
12

例如:

·let var+=1 #自加1后自赋值

[root@Centos7 bin]# let var+=1
[root@Centos7 bin]# echo $var
1
[root@Centos7 bin]# let var+=1
[root@Centos7 bin]# echo $var
2
[root@Centos7 bin]# let var+=1
[root@Centos7 bin]# echo $var
3

 

 

·let var++  #自加1后自赋值

[root@Centos7 bin]# let var++
[root@Centos7 bin]# echo $var
1
[root@Centos7 bin]# let var++
[root@Centos7 bin]# echo $var
2
[root@Centos7 bin]# let var++
[root@Centos7 bin]# echo $var
3
[root@Centos7 bin]#

 

·let var-=1 #自减1后自赋值

[root@Centos7 bin]# let var-=1
[root@Centos7 bin]# echo $var
2
[root@Centos7 bin]# let var-=1
[root@Centos7 bin]# echo $var
1
[root@Centos7 bin]# let var-=1
[root@Centos7 bin]# echo $var
0
[root@Centos7 bin]# let var-=1
[root@Centos7 bin]# echo $var
-1
[root@Centos7 bin]#

·let var–  #自减1后自赋值

[root@Centos7 bin]# let vat--
[root@Centos7 bin]# echo $vat
-1
[root@Centos7 bin]# let vat--
[root@Centos7 bin]# echo $vat
-2
[root@Centos7 bin]# let vat--
[root@Centos7 bin]# echo $vat
-3
[root@Centos7 bin]#

 

 

·运算符

·bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方)

[root@Centos7 bin]# declare -i var1=1    #申明整数变量var1
[root@Centos7 bin]# declare -i var2=2    #申明整数变量var2
[root@Centos7 bin]# echo " $var2/$var1 " #我们计算var2除以var1看说明结果?
 2/1 
[root@Centos7 bin]# echo " $var2 / $var1 "#我们计算var2除以var1看说明结果?
 2 / 1 
[root@Centos7 bin]# echo "$[$var1/$var2] " #算术运行需要特殊的格式
0 
[root@Centos7 bin]# echo "$[$var2/$var1] " #算术运行需要特殊的格式
2

·实现算术运算:

(1) let var=算术表达式

[root@Centos7 bin]# let var=1/2
[root@Centos7 bin]# echo $var
0

(2) var=$[算术表达式]

[root@Centos7 bin]# var=$[9-6]
[root@Centos7 bin]# echo $var
3

(3) var=$((算术表达式)

[root@Centos7 bin]# var=$((10/2))
[root@Centos7 bin]# echo $var
5

(4) var=$(expr arg1 arg2 arg3 …)

[root@Centos7 bin]# var=$(expr 1+2+3/3)
[root@Centos7 bin]# echo $var
4

(5) declare –i  var= 数值

[root@Centos7 bin]# declare -i var=100
[root@Centos7 bin]# echo $var
100

(6) echo ‘算术表达式’ | bc

[root@Centos7 bin]# echo '1+2+9*3+8'| bc
38

注意:乘法符号有些场景中需要转义,如*

[root@Centos7 bin]# var=$(expr 1*2+3/3)
[root@Centos7 bin]# echo $var
3
[root@Centos7 bin]# var=$(expr 2\*2+3/3)
[root@Centos7 bin]# echo $var
5

·生成随机数

bash有内建的随机数生成器:$RANDOM(1-32767) echo $[$RANDOM%50] :0-49之间随机数

$RANDOM%50:$RANDOM随机数除以50得到的余数肯定再0-49之间,那我们需要产生1-50之间的余数我们如何取得呢?

解:$[$RANDOM%50+1]即可:在余数(0-49)的基础上加1即可(1-50)

[root@Centos7 bin]# echo $[$RANDOM%50+1]
48
[root@Centos7 bin]# echo $[$RANDOM%50+1]
17
[root@Centos7 bin]# echo $[$RANDOM%50+1]
7
[root@Centos7 bin]# echo $[$RANDOM%50+1]
23
[root@Centos7 bin]# echo $[$RANDOM%50+1]
14
[root@Centos7 bin]# echo $[$RANDOM%50+1]
38

·数值条件测试

◎数值测试:

-gt: 是否大于;

-ge: 是否大于等于;

-eq: 是否等于;

-ne: 是否不等于;

-lt: 是否小于;

-le: 是否小于等于;

-gt大于测试:

[root@Centos7 bin]# declare -i var1=10
[root@Centos7 bin]# declare -i var2=20
[root@Centos7 bin]# [ $var1 -gt $var2 ] && echo "大于" || echo "不大于" 
不大于
[root@Centos7 bin]# [ $var2 -gt $var1 ] && echo "大于" || echo "不大于" 
大于

-ge: 大于等于测试:

[root@Centos7 bin]# declare -i  var1=20
[root@Centos7 bin]# declare -i var2=20
 
[root@Centos7 bin]# [ $var2 -ge $var1 ] && echo "大于" || echo "不大于" 
大于
[root@Centos7 bin]# [ $var1 -ge $var2 ] && echo "大于" || echo "不大于" 
大于

-eq: 等于测试:

[root@Centos7 bin]# declare -i var1=10
[root@Centos7 bin]# declare -i var2=11
[root@Centos7 bin]# [ $var1 -eq $var2 ] && echo "等于" || echo "不等于"
不等于
[root@Centos7 bin]# declare -i var2=10
[root@Centos7 bin]# [ $var1 -eq $var2 ] && echo "等于" || echo "不等于"
等于

-ne: 不等于测试:

[root@Centos7 bin]# echo $var1
10
[root@Centos7 bin]# echo $var2
10
[root@Centos7 bin]# [ $var1 -ne $var2 ] && echo "bu等于" || echo "等于"
等于
[root@Centos7 bin]# declare -i var2=11
[root@Centos7 bin]# [ $var1 -ne $var2 ] && echo "bu等于" || echo "等于"
bu等于

-lt: 小于测试:

[root@Centos7 bin]# echo $var1
10
[root@Centos7 bin]# echo $var2
11
[root@Centos7 bin]# [ $var1 -lt $var2 ] && echo "xiaoyu" || echo "buxiaoyu"
xiaoyu
[root@Centos7 bin]# [ $var2 -lt $var1 ] && echo "xiaoyu" || echo "buxiaoyu"
buxiaoyu

-le: 小于等于测试:

[root@Centos7 bin]# echo $var1
10
[root@Centos7 bin]# echo $var2
11
[root@Centos7 bin]# [ $var1 -lt $var2 ] && echo "xiaoyu" || echo "buxiaoyu"
xiaoyu
[root@Centos7 bin]# [ $var2 -lt $var1 ] && echo "xiaoyu" || echo "buxiaoyu"
Buxiaoyu

 

§·位置变量$0  $1  $2  $#  $@  $*

◎位置变量:

在脚本代码中调用通过命令行传递给脚本的参数

$1, $2, …:对应第1、第2等参数

$0: 命令本身名称

$*: 传递给脚本的所有参数,全部参数合为一个字符串

$@: 传递给脚本的所有参数,每个参数为独立字符串

$#: 传递给脚本的参数的个数

$@ $* 只在被双引号包起来的时候才会有差异

举例说明:

#脚本的内容如下:功能观察位置变量的对应的相互关系

[root@Centos7 bin]# cat test.sh 
#!/bin/bash
#author:lovme
#Version: 1.0
#Description:t测试脚本的位置变量参数
echo  "\$0 arg : $0"   #显示变量$0的值
echo  "\$1 arg : $1"  #显示变量$1的值 
echo  "\$2 arg : $2"  #显示变量$2的值 
echo  "\$3 arg : $3"  #显示变量$3的值
echo  "\$* arg : $*"  #显示变量$*的值
echo  "\$# arg : $#"  #显示变量$#的值
echo  "\$@ arg : $@" #显示变量$@的值

 

[root@Centos7 bin]# test.sh
$0 arg : /root/bin/test.sh   #不同执行方式 $0的显示值不一样的
$1 arg : 
$2 arg : 
$3 arg : 
$* arg : 
$# arg : 0
$@ arg : 
[root@Centos7 bin]# bash test.sh 
$0 arg : test.sh  #不同执行方式 $0的显示值不一样的
$1 arg : 
$2 arg : 
$3 arg : 
$* arg : 
$# arg : 0
$@ arg : 
[root@Centos7 bin]# ./test.sh 
$0 arg : ./test.sh  #不同执行方式 $0的显示值不一样的
$1 arg : 
$2 arg : 
$3 arg : 
$* arg : 
$# arg : 0
$@ arg : 
[root@Centos7 bin]# bash test.sh   1    234     xdfre,b 
$0 arg : test.sh  #不同执行方式 $0的显示值不一样的
$1 arg : 1    #为脚本后面第一个值: 1
$2 arg : 234 #为脚本后面第二个值: 234
$3 arg : xdfre,b #为脚本后面第三个值: xdfre,b
$* arg : 1 234 xdfre,b #为脚本是由的参数:1    234     xdfre,b (为一个字符)
$# arg : 3 #为脚本后面跟的参数的个数: 3
$@ arg : 1 234 xdfre,b #为脚本后面所有参数: 1    234     xdfre,b (为3个字符)

§·练习题

1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。

解:执行的结果如下,脚本的内容如下:

[root@Centos7 bin]# bash systeminfo.sh  #脚本执行的结果
hostname is : Centos7.local
host OS ver  is : CentOS Linux release 7.2.1511 (Core) 
host IPv2 addr is : inet 10.1.16.70
kernel ver is : 3.10.0-327.el7.x86_64
cpu ver is : Intel(R)Core(TM)i5-4210MCPU@2.60GHz
MEM is : 1001360kB
DISK is :200G

 

[root@Centos7 bin]# cat systeminfo.sh  #脚本的内容
#!/bin/bash
#author:chenjiashun
#Version: 1.0
#Description:
ipv4=$(ifconfig | sed -n '2p'| grep  -o "inet \([[:digit:]]\+\.\)\{3\}[[:digit:]]\+")
cpu=$(lscpu | grep "Model name" | cut -d: -f2 | tr -d "[[:space:]]")
mem=$(cat /proc/meminfo | head -1| cut -d: -f2|tr -d "[[:space:]]")
disk=$(lsblk | grep "\<sd[a-z]\>" | grep -o "\<[[:digit:]]\+G")
 
echo "hostname is : $HOSTNAME"
echo "host OS ver  is : $(cat /etc/redhat-release)"
echo "host IPv2 addr is : $ipv4"
echo "kernel ver is : $(uname -r)"
echo -e "cpu ver is : $cpu"
echo "MEM is : $mem"
echo "DISK is :$disk"

 

2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd

解:脚本内容如下:

[root@Centos7 bin]# cat backup.sh 
#!/bin/bash
#author:chenjiashun
#Version: 1.0
#Description:
cp -a /etc/  /root/etc$(date +%F)

3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

解:脚本内容如下

[root@Centos7 bin]# cat disk.sh 
#!/bin/bash
#author:chenjiashun
#Version: 1.0
#Description:
disk=$(df | grep -v "dev/sr[0-9]" | grep -o "[[:digit:]]\+%" | sort -n | tail -1)
echo "DISK is shi yong zui da : $disk"

 

4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

解:脚本的内容如下:

[root@Centos7 bin]# bash links.sh   #脚本执行的结果
Links is :       2 10.1.16.1
 
[root@Centos7 bin]# cat links.sh   #脚本的内容
#!/bin/bash
#author:chenjiashun
#Version: 1.0
#Description:
links=$(w | grep -o "\([[:digit:]]\+\.\)\{3\}[[:digit:]]\+"|sort -n | uniq -c)
echo "Links is : $links"

5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户到第20用户的ID之和

解:脚本的内容如下:

[root@Centos7 bin]# cat sumid.sh   #脚本的内容
#!/bin/bash
#author:chenjiashun
#Version: 1.0
#Description:
SUM_ID=$( sed -n '10,20p' /etc/passwd | cut -d: -f3 |tr '\n'  '+'|  sed   's@[^[:digit:]]\+$@\n@' | bc)
#过滤出第10个到第20个用户的UID号,通过sed把取出来的数字处理成:1+2+3.....+20的格式,穿给bc得到uid之和
echo "10user...20user UID sum is :$SUM_ID"
 
[root@Centos7 bin]# sumid.sh  #脚本执行的结果
10user...20user UID sum is :4439

 

6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

解:脚本内容如下:

[root@Centos7 bin]# cat sumspace.sh 
#!/bin/bash
#author:chenjiashun
#Version: 1.0
#Description:
file1=$(grep '^[[:space:]]\+$' $1 | wc -l)   #统计位置变量1 的空行之和
file2=$(grep '^[[:space:]]\+$' $2 | wc -l )  #统计位置变量2 的空行之和
let sum_space=$file1+$file2           #使用算术运算把两个空行之和保存在变量 sum_space中
echo "$1 space is : $file1"
echo "$2 space is : $file2" 
echo "$1 and $2 space sum is : $sum_space"
 
[root@Centos7 bin]# bash  sumspace.sh /etc/issue /etc/bashrc  #脚本的执行结果如下
/etc/issue space is : 1
/etc/bashrc space is : 7
/etc/issue and /etc/bashrc space sum is : 8

7、写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件

解:

[root@Centos7 bin]# cat sumfile.sh  #查看脚本内容
#!/bin/bash
#author:chenjiashun
#Version: 1.0
#Description:
etc_file=$(ls -l /etc/ | grep '^-' | wc -l)
etc_dir=$(ls -l /etc/ | grep '^d' | wc -l)
var_file=$(ls -l /var/ | grep '^-' | wc -l)
var_dir=$(ls -l  /var/ | grep '^d' | wc -l)
usr_file=$(ls -l  /usr/ | grep '^-' | wc -l)
usr_dir=$(ls -l  /usr/ | grep '^d' | wc -l)
echo " /etc files is :$etc_file";
echo " /etc  dir is :$etc_dir";
echo " /var  files is :$var_file";
echo " /var  dir is :$var_dir";
echo " /usr  files is :$usr_file";
echo " /usr  dir is :$usr_dir";
 
[root@Centos7 bin]# bash sumfile.sh  #查看脚执行结果
 /etc files is :120
 /etc  dir is :127
 /var  files is :1
 /var  dir is :18
 /usr  files is :0
 /usr  dir is :11

8、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

解答:

[root@Centos7 bin]# cat argsnum.sh   #查看脚本内容
#!/bin/bash
#author:chenjiashun
#Version: 1.0
#Description:
read -p "please input file lujing :" filename
[[ -z $filename  ]] >/dev/null && echo "give one arg"&&exit 1
 
[[ -n $filename  ]] >/dev/null && echo "space num is $(grep "^$" $filename | wc -l)" 
 
[root@Centos7 bin]# bash argsnum.sh  #查看脚执行结果
please input file lujing :
give one arg
[root@Centos7 bin]# bash argsnum.sh 
please input file lujing :/etc/issue
space num is 1

 

 

 

9、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

解答:

[root@Centos7 bin]# cat hostping.sh  #查看脚本内容
#!/bin/bash
#author:chenjiashun
#Version: 1.0
#Description:
read -p "please input host ip :" hostip
[ -z $hostip ]&& echo "please give one hostip biru :xx.xx.xx.xx"&&exit 10 
[ -n $hostip ]&&ping $hostip -c1 -W1 >/dev/null && echo "该IP地址可以访问" || echo "该IP地址不可访问"
 
 
[root@Centos7 bin]# bash hostping.sh #查看脚执行结果
please input host ip :10.1.1.1
该IP地址不可访问
[root@Centos7 bin]# bash hostping.sh 
please input host ip :10.1.0.100
该IP地址不可访问
[root@Centos7 bin]# bash hostping.sh 
please input host ip :10.1.16.70
该IP地址可以访问
[root@Centos7 bin]#

 

10、判断硬盘的每个分区空间和inode的利用率是否大于80,如果是,发邮件通知root磁盘满

解答:

[root@Centos7 bin]# cat 10_num.sh  #查看脚本内容
#!/bin/bash
#author:chenjiashun
#Version: 1.0
#Description: 
declare -i  part_used     #声明整数变量 存放分区最大值
declare -i  inode_used    #声明整数变量 存放inode最大值
part_used=$(df | grep  -v '/dev/sr0' | grep  -o '[[:digit:]]\+\%' | tr -d "%" | sort -n | tail -1)
#取出分区使用率最大值
inode_used=$(df -i | grep  -v '/dev/sr0' | grep  -o '[[:digit:]]\+\%' | tr -d "%" | sort -n | tail -1)
#取出inode号使用最大值
echo "feng qu shi yong zui da bai fen bi wei : $part_used"
echo "inode  shi yong zui da bai fen bi wei : $inode_used"
[ $part_used -gt 80  ] || [ $inode_used -gt 80 ] && echo "ci pan mang!!!" | mail -s "worring" root
#判断取出的数值是否大于80,大于80就发送邮件给root提醒root磁盘满
 
[root@Centos7 bin]# bash 10_num.sh    #测试脚本信息
feng qu shi yong zui da bai fen bi wei : 74
inode  shi yong zui da bai fen bi wei : 1
[root@Centos7 bin]# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1         191148  141200     49948  74% /boot
 
[root@Centos7 bin]# df -i
Filesystem       Inodes  IUsed    IFree IUse% Mounted on
/dev/sda2      48827392 148759 48678633    1% /

 

11、指定文件做为参数,判断文件是否为.sh后缀,如果是,添加x权限

解答:

[root@Centos7 bin]# cat 11_num.sh  #查看脚本内容
#!/bin/bash
read -p "please input file name :" filename
#提示用户输入一个文件的路径
[ -z $filename ]&&echo -e "\033[31m please input file name arg bi ru: $0 /PATH/SOME_FILE\033[0m "&& exit 100
#判断文件路径是否为空,为空就退出脚本并提醒用户输入一个路径
 file_huozhui=$(echo "$filename" | sed   "s@.*\(\.sh\)@\1@") &>/dev/null
#取出路径的文件名的后缀
[  ! -f $filename  ]&&echo "worry file name ,please chck..........."&& exit 101
#判断文件是否存在
[  ! .sh ==  $file_huozhui ]&&echo "worry file name .sh,please chck..........."&&exit 102
#判断文件的后缀是不是 .sh
[ -f $filename ]&&[ .sh == $file_huozhui ] && chmod +x $filename && echo "chmod+x  $filename  sueeccfull.........."
#文件存在并且后缀是.sh给文件添加执行权限,并通知用户修改完成
 
[root@Centos7 bin]# ll  #测试脚本的结果
-rwxr-xr-x. 1 root root 243 Aug 10 17:32 hostping.sh
-rw-r--r--. 1 root root 118 Aug 11 09:28 links.sh #没有执行权限
 
[root@Centos7 bin]# bash 11_num.sh 
please input file name :/root/bin/links.sh
chmod+x  /root/bin/links.sh  sueeccfull..........  #修改权限执行成功
[root@Centos7 bin]# ll
-rwxr-xr-x. 1 root root 118 Aug 11 09:28 links.sh   #文件权限修改完成

 

12、判断输入的IP是否为合法IP

解答:

[root@Centos7 bin]# cat 12_num.sh   #查看脚本内容
#!/bin/bash
 
read -p "please input ip addr :" hostip 
 
echo"$hostip"|egrep "(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>)\.(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>)\.(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>)\.(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>)" > /dev/null && echo "IP 地址是合法的" || echo "IP地址不是合法的"
 
 
[root@Centos7 bin]# bash 12_num.sh  #查看脚本执行结果
please input ip addr :10.1.16.70
IP 地址是合法的
[root@Centos7 bin]# bash 12_num.sh 
please input ip addr :0.1.1.200
IP地址不是合法的

13、计算1+2+3+…+100

解答:

[root@Centos7 bin]# cat 13_num.sh  #查看脚本内容
#!/bin/bash
sum=$(echo {1..100} | tr " " "+" |bc )
echo "digit 1 .... 100 sum is : $sum"
 
[root@Centos7 bin]# bash 13_num.sh  #测试脚本执行结果
digit 1 .... 100 sum is : 5050

 

14、输入起始值A和最后值B,计算从A+A+1…+(B-1)+B的总和

解答:

[root@Centos7 bin]# cat 14_num.sh  #查看脚本文件内容
#!/bin/bash
read -p "pleas input one number is : "  numa  #用户交互输入其实的整数
expr $numa + 65530 &> /dev/null  
#判断输入的是否为整数,我们通过 expr Num1  + Num2的执行结果可以判断输入是否为整数 
为什么需要让用户输入的数字加上65530,测试发现,如果 expr 结果为0 ,会导致返回值 $?为非零,为了安全起见就设置了一个很大的值,如果用户输入 -65530 会导致脚本报错。 
[ 0 != $? ] && echo "please input one zhengque de zhengshu "&&exit 2  #如果输入非整数 脚本退出
 
read -p "please input one number is : " numb
expr $numb + 65530 &> /dev/null
[ 0 != $? ] && echo "please input one zhengque de zhengshu "&&exit 3
 
[ $numb -le $numa ]&& echo "numb must -ge numa ,please chack....."&&exit 5 
#判断数值B必须大于数值A,不让就退出。
suma_b=$(seq $numa $numb |tr "\n" "+" |sed -r 's@[^[:digit:]]+$@\n@' |bc)
#让seq生成 A到B的数据序列,通过tr 与sed把格式转换为 1+2+3...100的格式,传给bc即可
echo "your input NUM-A is : $numa ;"
echo "your input NUM-B is : $numb ;"
echo "NUMA ....NUMB sum is  : $suma_b ."
 
 
 
[root@Centos7 bin]# bash 14_num.sh  #测试脚本执行的结果(1加到100)
pleas input one number is : 0
please input one number is : 100
your input NUM-A is : 0 ;
your input NUM-B is : 100 ;
NUMA ....NUMB sum is  : 5050 .
 
[root@Centos7 bin]# bash 14_num.sh  #输入小数测试
pleas input one number is : -1.1
please input one zhengque de zhengshu 
 
[root@Centos7 bin]# bash 14_num.sh  #输入 20 加到10的参数
pleas input one number is : 20
please input one number is : 10
numb must -ge numa ,please chack.....

原创文章,作者:linux_root,如若转载,请注明出处:http://www.178linux.com/33454

(0)
linux_rootlinux_root
上一篇 2016-08-12
下一篇 2016-08-12

相关推荐

  • 马哥教育网络班21期+第11周课程练习

    1、详细描述一次加密通讯的过程,结合图示最佳。 首先发送方用单向加密的方法提取数据的特征码,用自己的私钥加密这段特征码,并附加到数据的后面。 发送方用对称加密算法把数据及特征码整个进行加密。 发送方用接收发的公钥加密对称密钥并附加到数据后面。 接收方用私钥解密对称密钥。 接收方用对称密钥解密出数据及加密的特征码。 接收方用发送方的公钥解密特征码,并用相同的算…

    Linux干货 2016-10-09
  • 马哥教育网络班N22期+第2周课程练习

    马哥教育网络班N22期+第2周课程练习 1 linux上的常用文件管理类命令 1.1 常用文件查看命令 MORE命令 作用:分屏显示查看文件内容 用法:more file 查看翻页方式: B键向上 一页 空格向下一页 enter键一行一行翻阅 翻到最后一行自动退出 LESS命令 作用:分屏显示查看文件内容 用法:less file 查看方式:less命令与查…

    Linux干货 2016-08-29
  • 系统排错——如何修复和保护你的系统

    作业 1、破解root口令,并为grub设置保护功能 开机启动时按e进入grub菜单,然后按a 编辑当前菜单的kernel选项,在后面追加1,s,S,single中的任意一个,然后回车,输入b键启动 进入了单用户模式,可以直接修改root密码 如何为grub设置保护功能: (1)、首先生成grub的md5密码 (2)、修改grub.conf文件 (3)、重启…

    Linux干货 2016-09-12
  • 程序包管理初步

    升级:       rpm {-U|–upgrade} [install-options] PACKAGE_FILE …                -U:升级或安装;       rpm {-…

    Linux干货 2016-12-31
  • Linux的启动流程

    Linux的启动流程大致上如下图. 现在详细说明一下每个步骤: 第一阶段 当系统启动时,系统首先会加载BIOS。BIOS的首先会检查各硬件设备,当检查完毕没有问题之后。BIOS会根据设定的BootSequence来寻找可以引导系统的设备。一般而言,Linux是通过磁盘上MBR来引导系统的。 第二阶段 MBR是Master Boot Record,是位于磁盘第…

    Linux干货 2016-02-28
  • vsftpd虚拟用户搭建

    首选的FTP服务器搭建方式 安装vsftpd      yum install -y vsftpd      systemctl enable vsftpd     #设置开机启动      systemctl is-enabled vsf…

    Linux干货 2017-04-27

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-12 13:34

    文章整体架构清晰,内容丰满,有理论与实践,标题可以取简介一点,整个文章排版有很用心哦,再接再励。