爲了搞懂環境變量,作了一個小實驗,體會到環境變量究竟是什麼樣子的。node
[root@localhost ~]# cat 1.shshell
#!/bin/bashcentos
echo $nbash
[root@localhost ~]# cat 22.shide
#!/bin/bash測試
export n=98spa
/root/1.sh操作系統
我在22.sh文件中定義了環境變量n,而且執行1.sh文件。在1.sh文件中執行echo $n 。而後我給兩個文件都加上x權限,執行22.sh,咱們將會獲得什麼呢?blog
[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進程結束而消失,若是當前進程關閉,則子進程沒法在使用父進程中的環境變量。
練習:
一、編寫腳本/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]`"
二、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄備份到/root/etcYYYY-mm-dd中
#/bin/bash
cp -r /etc/ /root/etc`date +%F`
三、編寫腳本/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`"
四、編寫腳本/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`"
五、寫一個腳本/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"
六、寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件路徑做爲參數給腳本,計算這兩個文件中全部空白行之和
#!/bin/bash
first=`grep "^$" $1 | wc -l`
second=`grep "^$" $2 | wc -l`
SUM=$[$first+$second]
echo "The sum is $SUM"
七、寫一個腳本/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"
八、寫一個腳本/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"
九、寫一個腳本/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"
十、判斷硬盤的每一個分區空間和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
十一、指定文件作爲參數,判斷文件是否爲.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."
十二、判斷輸入的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 "
1三、計算1+2+3+...+100
#!/bin/bash
echo {1..100} | tr " " "+" |bc
1四、輸入起始值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`"