为了搞懂环境变量,做了一个小实验,体会到环境变量到底是什么样子的。
[root@localhost ~]# cat 1.sh
#!/bin/bash
echo $n
[root@localhost ~]# cat 22.sh
#!/bin/bash
export n=98
/root/1.sh
我在22.sh文件中定义了环境变量n,并且执行1.sh文件。在1.sh文件中执行echo $n 。然后我给两个文件都加上x权限,执行22.sh,我们将会得到什么呢?
[root@localhost ~]# ./22.sh
98
很明显,我们得到了98。但在22.sh中,并没有直接echo $n的命令,但我们调用了1.sh命令,所以可以打印出$n。那么问题就来了,1.sh中并没有变量n=98,98又是怎么跑到n里面的呢?让我们来看下面这张图。
首先22.sh中声明了环境变量n=98,当22.sh执行1.sh文件时,1.sh会引用22.sh中的环境变量n,然后执行自身的echo $n命令,再将结果送到22.sh中。
实验总结:
环境变量对当前的shell进程和其子进程
环境变量随当前shell进程结束而消失,如果当前进程关闭,则子进程无法在使用父进程中的环境变量。
练习:
1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。
echo "The hostname is: `hostname`"
echo "The ip address is: `ifconfig | sed -n ‘s@^[[:space:]]\+inet[[:space:]]@@p‘ | head -n 1 | cut -d ‘ ‘ -f 1`"
echo "The systerm is: `cat /etc/centos-release`"
echo "The kenerl is : `uname -r`"
echo "The cpu is: `lscpu | sed -n ‘13p‘|tr -s " "|cut -d " " -f 3-7`"
echo "The MemTotal is : `cat /proc/meminfo | sed -n ‘1p‘| tr -s ‘ ‘|cut -d " " -f 2-3`"
echo "The disk size is : `fdisk -l | grep "\<sd[a-z]\>" | cut -d " " -f 3-4 | tr ‘,‘ ‘ ‘dev/sd[a-z]`"
2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
#/bin/bash
cp -r /etc/ /root/etc`date +%F`
3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
#!/bin/bash
echo "The use number of disk :`df | grep "sd" | tr -s ‘ ‘ | cut -d " " -f 5|sort -n | tail -n 1`"
4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
#!/bin/bash
echo "`netstat -nt|tr -s ‘ ‘| cut -d ‘ ‘ -f 4 | grep "^[0-9]"|cut -d: -f1 | uniq -c |sort -nr`"
5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
#/bin/bash
USER10=`cat /etc/passwd | sed -n ‘10p‘ | cut -d: -f 3`
USER20=`cat /etc/passwd | sed -n ‘20p‘ | cut -d: -f 3`
SUM=$(($USER10+$USER20))
echo "The sum is $SUM"
6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
#!/bin/bash
first=`grep "^$" $1 | wc -l`
second=`grep "^$" $2 | wc -l`
SUM=$[$first+$second]
echo "The sum is $SUM"
7、写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
#!/bin/bash
Etc=`ls -1 /etc | wc -l`
Var=`ls -l /var | wc -l`
Usr=`ls -l /usr | wc -l`
Sum=$[Etc+Var+Usr]
echo "The SUM is $Sum"
8、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
#!/bin/bash
read -p "please give me the filesname:" filename
[ -e $filename ] && echo "The file space lines are:$(grep "^$" $filename | wc -l )" || echo "No file"
9、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
#!/bin/bash
read -p "you want to ping IPv4:" Ip
ping -c1 -W1 $Ip &> /dev/null && echo "ping successful" && exit || echo "ping failed"
10、判断硬盘的每个分区空间和inode的利用率是否大于80,如果是,发邮件通知root磁盘满
#!/bin/bash
Inode=`df -i | grep "sd[a-z]" | tr -s " " | cut -d " " -f 5 | sed ‘s@\%@@‘`
Disk=`df | grep "sd" | tr -s ‘ ‘ | cut -d " " -f 5 | sed ‘s@\%@@‘`
[ $Inode -ge 80 ] || [ $Disk -ge 80 ] && mail -s "NO free size for your DISK" root < help.txt
11、指定文件做为参数,判断文件是否为.sh后缀,如果是,添加x权限
#!/bin/bash
read -p "please give a filename:" file
[[ $file =~ .*.sh$ ]] && chmod +x ./$file && echo "This is a shellfile." || echo "This is not a shellfile."
12、判断输入的IP是否为合法IP
#!/bin/bash
read -p "please write IP:" Ip
echo "$Ip"| egrep -o "\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>.\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>.\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>.\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"&> /dev/null && echo "right ip" || echo "worng ip "
13、计算1+2+3+...+100
#!/bin/bash
echo {1..100} | tr " " "+" |bc
14、输入起始值A和最后值B,计算从A+(A+1)...+(B-1)+B的总和
#!/bin/bash
read -p "first number:" a
read -p "second number:" b
[ $a -ge $b ] && echo "sum is `seq -s+ $b $a | bc`" || echo "sum is `seq -s+ $a $b | bc`"
本文出自 “zebra930” 博客,请务必保留此出处http://zebra930.blog.51cto.com/11736340/1836789
原文地址:http://zebra930.blog.51cto.com/11736340/1836789