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)
上一篇 2016-08-12 09:01
下一篇 2016-08-12 09:01

相关推荐

  • systemd、awk命令 N28

    第八周-2018 1/22

    2018-01-22
  • Nginx及其相关配置详解(二)

    与套接字相关的配置: 1、server { … }  #配置一个虚拟主机;         Default:—         Context:http server { # 配…

    2017-07-14
  • 梦想走向现实的地方

    曾经羡慕打字快的同学指尖能在键盘上优雅地跳舞,于是我有努力练习打字。 曾经羡慕同事能很神奇地把一个交换机的端口关闭,让那端口下面的人都不能上网,于是我努力学习交换机、路由。 现在我羡慕一个人能管很多服务器的人,于是我开始学习linux了。 努力成为一个也能管很多服务器的人,因为我也想别人叫我运维工程师

    Linux干货 2016-10-25
  • CentOS7 Local yum的一次报错信息

    说明:今天在火车上测试一个CentOS7下的一个服务,要用到yum配置,但是本机没有联网,所以考虑到配置本地yum,按照之前CentOS6下的常规方法,居然发现有报错。 操作如下: 1)虚拟机下将CentOS7光盘加载到系统里面,然后挂载到本地的/localyum上 [root@localhost yum.repos.d]# mount&…

    Linux干货 2016-07-16
  • 文本编辑秘籍之vim宝典

    一、初识Vim Vim是从 vi 发展出来的一个文本编辑器。其功能非常强大,熟练掌握vim的常用操作和快捷操作能让我们从繁杂的文本处理任务中杀出血路,在运维的道路上愉快前行。 vim使用简单命令组合来完成复杂操作,同时也支持基本正则表达式。 二、拨开vim迷雾: 2.1 使用vim打开一个文件: 如果该文件存在,文件被打开并显示内容;如果该文件不存在,当编辑…

    Linux干货 2016-08-10
  • 任务计划使用方法

    概述     任务计划其实就是针对未来的某一刻或者是某一周期内设置要执行的工作;     任务计划分为两种:         1、一次性任务:在指定的未来的某个时间点仅执行一次任务;  &n…

    Linux干货 2015-03-26

评论列表(1条)

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

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