shell作为用户和Unix/Linux沟通的桥梁,既可以是一个可执行的二进制程序,同时也是一个具备了编程能力的程序设计语言,定义了各种各样的变量和参数,下面介绍一下shell之上的各种变量。
1、本地变量
特性:只对当前shell生效
[root@centos7 ~/bin]#cat localvar1.sh #!/bin/bash # var1=hei echo "localvar1:$var1" localvar2.sh [root@centos7 ~/bin]#cat localvar2.sh #!/bin/bash var2=ha echo "localvar2:var2 is "$var2"" echo "localvar2:var1 is "$var1"" [root@centos7 ~/bin]#localvar1.sh localvar1:hei localvar2:var2 is ha localvar2:var1 is
localvar1脚本中输出var1变量之外,还执行了localvar2脚本,同时打开了一个子shell,而在localvar2中,不仅输出var2变量,还要输出前一个shell中定义的var1。因为本地变量只对当前shell有效,所以子shell中输出不成功。
2、环境变量
[root@centos7 ~/bin]#cat localvar1.sh #!/bin/bash # export var1=hei echo "localvar1:$var1" localvar2.sh [root@centos7 ~/bin]#localvar1.sh localvar1:hei localvar2:var2 is ha localvar2:var1 is hei
注意:还是上述例子,只需将localvar1中的var1定义为环境变量,localvar1中定义的var1的作用范围将扩展至当前shell及其子shell,所以localvar2中可以输出var1。
3、特殊变量
<1>区分$*和$@
[root@centos7 ~/bin]#cat arg1.sh #!/bin/bash # arg2.sh "$*" echo -------------- arg2.sh "$@" [root@centos7 ~/bin]#cat arg2.sh #!/bin/bash echo "First parameter is $1" echo "Second parameter is $2" [root@centos7 ~/bin]#arg1.sh a b First parameter is a b Second parameter is -------------- First parameter is a Second parameter is b
执行arg1脚本时,实际上是通过将$*和$#作为参数赋予脚本arg2,来执行arg2,子shell中执行的arg2脚本再将这俩个参数输出,进而区分$*和$@的区别。得出结论:$*将全部参数作为一个字符串,而$#将全部参数识别为独立的字符串。
注意:
<2>认识$#,$0,$?
[root@centos7 ~/bin]#cat test.sh #!/bin/bash # echo $0 echo $# [root@centos7 ~/bin]#echo $? 0
上面可以看出:$0是脚本的名称,$#是参数的个数,而$?是测试上一条命令是否执行成功。
4、位置变量
[root@centos7 ~/bin]#cat countdao.sh #!/bin/bash # echo "$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} $11 $12" [root@centos7 ~/bin]#countdao.sh a b c a b c a1 a2 [root@centos7 ~/bin]#countdao.sh z b c z b c z1 z2
位置变量中$1..$9正常识别,$10将被识别为$1+1,解决方法$10-->${10}
5、局部变量
特点:只对特定的代码片段生效
强化练习
1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
#!/bin/bash #Author:Zhao #Name:Systeminfo #Function:A brief description of the system infomation #--------- IP=`ifconfig | sed -n ‘2p‘ | tr -s ‘ ‘ | cut -d‘ ‘ -f3` OS_Version=`cat /etc/centos-release` Kernel=`cat /etc/centos-release` CPU_Model=`cat /proc/cpuinfo | grep "model name" | sed -r ‘s@.*[[:space:]](i7.*)@\1@‘` Disk_Available=`fdisk -l | sed -n ‘2p‘ | tr ‘,‘ ‘:‘ | cut -d: -f2` Memory=`cat /proc/meminfo | head -1 | sed -r ‘s@^.*[[:space:]]([[:digit:]]+.*)@\1@‘` echo "IP:$IP" echo "OS_Version:$OS_Verson" echo "Kernel:$Kernel" echo "CPU_Model:$CPU_Model" echo "Disk_Available=$Disk_Available" echo "Memory:$Memory"
2、编写脚本/root/bin/backup.sh,可实现手动将/etc/目录备份到/root/etcYYYY-mm-dd中
#!/bin/bash #Author:Zhao #Name:backup.sh #Function:Backup /etc directory cp -a /etc/ /root/etc`date +%F`
3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
#!/bin/bash #Author:Zhao #Name:disk.sh #Function:Query disk usage Maxdisk=`df | grep -v "media" | grep dev | tr ‘ ‘ ‘:‘ | tr -s ‘:‘ | cut -d: -f1,5 | sort -t: -k2 | tail -1` echo "Maximum disk usage is:$Maxdisk"
4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
#!/bin/bash #Author:Zhao #Name:links.sh #Function:Query current numbers of connection links=`netstat -tn | grep tcp | tr -s ‘ ‘ | cut -d‘ ‘ -f5 | sort -r` echo -e "The numbers of connection are\n$links"
5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
#!/bin/bash #Author:Zhao #Name:sumid.sh #Function:Calculate the sum of ID line1=10 line2=20 ID1=`sed -n ‘‘$line1‘p‘ /etc/passwd | cut -d: -f3` -----特别注意sed处的变量替换的写法 ID2=`sed -n ‘‘$line2‘p‘ /etc/passwd | cut -d: -f3` sumid=$[$ID1+$ID2] echo "The sum of ID is:$sumid"
6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
#!/bin/bash #Author:Zhao #Name:sumspace.sh #Function:Calculate the number of blank lines line1=`grep "^$" $1 | uniq -c` line2=`grep "^$" $2 | uniq -c` linesum=$[$line1+$line2] echo "The number of blank lines is: $linesum"
7、写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
#Author:Zhao #Name:sumspace.sh #Function:Calculate the number of directorys and files etc_file=`ls -A /etc | wc -l` var_file=`ls -A /var | wc -l` usr_file=`ls -A /var | wc -l` file_sum=$[$etc_file+$var_file+$usr_file] echo "The sum of directory and files is:$file_sum" unset etc_file unset var_file unset usr_file
7、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行
#!/bin/bash #Author:Zhao #Name:links.sh #Function:Query current numbers of connection [ $# -lt 1 ] && (echo "At least input a parameter"; exit) || (`grep "^$" $1 | wc -l` && echo "The blank lines is:$blank") unset blank
8、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
本文出自 “dmwing” 博客,请务必保留此出处http://dmwing.blog.51cto.com/11607397/1837367
原文地址:http://dmwing.blog.51cto.com/11607397/1837367