Bash Shell脚本基础–变量类型–位置变量
§·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
评论列表(1条)
文章整体架构清晰,内容丰满,有理论与实践,标题可以取简介一点,整个文章排版有很用心哦,再接再励。