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.www58058.com/33454
文章整體架構清晰,內容豐滿,有理論與實踐,標題可以取簡介一點,整個文章排版有很用心哦,再接再勵。