Bash Shell腳本基礎-變量類型-位置變量

Bash Shell腳本基礎變量類型位置變量

 

§·bash shell腳本編程概述: 1

§·bash shell腳本中的變量 2

    *什么是變量 2

    *變量的類型 2

    *bash  shell變量區別 2

            №1字符型變量: 2

        ·申明 2

        ·賦值 3

        ·運算符 3

        ·條件測試 3

        №2整數型變量: 5

        ·申明: 5

        ·賦值 5

        ·運算符 6

        ·實現算術運算: 7

        ·生成隨機數 7

        ·數值條件測試 8

        -gt大于測試: 8

        -ge: 大于等于測試: 8

        -eq: 等于測試: 8

        -ne: 不等于測試: 9

        -lt: 小于測試: 9

        -le: 小于等于測試: 9

        §·位置變量$0  $1  $2  $#  $@  $* 9

◎位置變量: 9

◎舉例說明: 10

§·練習題 11

 

 

 

 

 

 

§·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

(0)
linux_rootlinux_root
上一篇 2016-08-12
下一篇 2016-08-12

相關推薦

  • GRUB加密、修復和破解密碼實戰指南

    GRUB加密、修復和破解密碼實戰指南 GRUB(Boot Loader) 從系統啟動流程可以得知,在BIOS讀取相關信息之后,接下來是去第一個可以啟動的設備當中的MBR中讀取Boot Loader信息,Boot Loader提供具有菜單功能、直接加載內核信息,以及相關的控制權轉交功能。所以說系統啟動必須要有Boot Loader,然后才能去加載內核。 Boo…

    Linux干貨 2016-09-19
  • shell腳本編程

    一、編程基礎: shell腳本是包含一些命令或聲明,并符合一定格式的文本文件 shell腳本的用途有: 自動化常用命令 執行系統管理和故障排除 創建簡單的應用程序 處理文本或文件 1)     第一步:使用文本編輯器來創建文本文件 script.sh 并編寫內容 格式要求:首行shebang &nb…

    Linux干貨 2016-08-15
  • 13-高級文件系統管理-Quota,RAID,LVM

    配置配額系統     綜述         在內核中執行         以文件系統(磁盤分區)為單位啟用         對不同組或者用戶的策略不同         根據塊或者節…

    2017-03-16
  • shell編程作業

    1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。 [root@localhost sh.log]# cat systeminfo.sh  #!/bin/bash #author:DYW #顯示當前主機系統…

    Linux干貨 2016-08-15
  • linux學習記錄

    vm使用記錄 1、安裝vm程序; 2、下載Cenos—6.4*86_64_bin-DVD1.iso 安裝: 1、新建一個虛擬機; 2、選擇自定義安裝(高級); 3、兼容性選擇默認方式; 4、安裝客戶機操作系統(選擇稍后安裝操作系統方式); 5、選擇客戶機操作系統(選擇Linux系統,版本號(選擇自己下載的Linux系統版本,例如centos等)); 6、命名…

    Linux干貨 2015-12-10
  • lvs初探

    LVS 簡述 HA基礎知識 lvs配置 簡述 什么是lvs? lvs是linux virtual server linux虛擬服務的縮寫,通過一臺調度服務器來調度收到的請求并分發給后端的real server。 lvs的功能是什么? lvs能夠實現在大并發的情況下,將前端調度器收到的請求分發給后端服務器處理,實現了負載均衡集群的作用。 lb基礎知識 lb集群…

    Linux干貨 2016-05-31

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-12 13:34

    文章整體架構清晰,內容豐滿,有理論與實踐,標題可以取簡介一點,整個文章排版有很用心哦,再接再勵。

欧美性久久久久