Linux運維學習歷程-第十一天-bash邏輯運算、測試類型和腳本語句

概述:本篇重點介紹linux當中默認設立了類型,bash的邏輯運算、測試類型和腳本語句,本篇內容極其重要,望小伙伴們在日后的學習中用心學習

一、邏輯運算

變量:

  本地變量、環境變量、局部變量、位置參數變量、特殊變量

  變量賦值:name=value,export name=value,declare -x name=value

  變量引用:$name,${name}

  注意:有些時候{}不能省略,例如

       echo "$valuemagedu.com" 

       echo "${value}magedu.com"

   撤銷:unset name

bash腳本編程,運行腳本

#!/bin/bash      #稱為shebang是bash腳本的默認開頭行固定格式

#             #   #號后面是注釋信息,不顯示也不影響腳本執行結果

空白行          忽略不顯示行

bash的配置文件

porfile類:登錄式shell

bashrc類:非登錄式shell

登錄式shell:/etc/profile–>/etc/profile.d/*.sh–>~/.bash_profile–>~/.bashrc–>/etc/bashrc

非登錄式shell:~/.bashrc–>/etc/bashrc–>/etc/profile.d/*.sh

    

算數運算

   +,-,*,/,**(乘次方),%(求模取余)

在bash中默認數據類型都是字符串形式,做算數運行需要經特殊方法才可以

示例:     

[root@localhost ~]# num1=2
[root@localhost ~]# num2=9
[root@localhost ~]# echo "${num1}+${num2}"
2+9
[root@localhost ~]# declare -i num3=5
[root@localhost ~]# declare -i num4=9
[root@localhost ~]# echo "${num3}+${num4}"
5+9

算術運算格式:

(1)let VAR=算數運算表達式

[root@localhost ~]# let ${num1}+${num2}

#默認不輸出結果到屏幕,所以需要賦值給變量,再引用

[root@localhost ~]# let sum5=${num1}+${num2}
[root@localhost ~]# echo ${sum5}
11

let 參數 [參數 …]

   算術運算格式含義

    num++,num– (兩個減號不是大橫線)變量后遞增,后遞減

     ++num,–num(兩個減號不是大橫線)變量前遞增,前遞減

     +,-加法、 減法

     !,~ 邏輯和按位求反

     ** 求冪運算(乘次方)

     *,/,%  乘法,除法,求模(求余)           

     <<,>> 左和右移位

     <=,>=,<,> 比較

      ==、 != 平等,不平等

      & 按位與

     ^ 按位異或

     | 按位或

      && 邏輯與

      || 邏輯或

      expr ?expr: expr

條件運算符

       =, *=, /=, %=,+=, -=, <<=, >>=,&=,^=,|= 賦值

變量也可以作為let 命令的參數              

(2)VAR=$[算數運算表達式]   

但是不能直接運行,賦不賦值給變量都可以,需要命令直接引用,如echo

[root@localhost ~]# $[${num2}+${num3}]
bash: 14: 未找到命令...
[root@localhost ~]# echo "$[${num2}+${num3}]"
14

(3)VAR=$((算數運算表達式))  

但是不能直接運行,賦不賦值給變量都可以,需要命令直接引用,如echo

[root@localhost ~]# $((${num2}+${num3}))
bash: 14: 未找到命令...
[root@localhost ~]# echo $((${num2}+${num3}))
14

(4)expr EXPRESSION 或 VAR=$(expr EXPRESSION)

  expr OPTION

示例:

[root@localhost ~]# num1=2
[root@localhost ~]# num2=4
[root@localhost ~]# expr ${num1} + ${num2}
6
[root@localhost ~]# sum=$(expr ${num1} \* ${num2})
#注意乘法*符號需要轉意(原因是*號在有些場景中為glob通配符)
[root@localhost ~]# echo "${sum}"
8

expr 參數的算術運算格式

                ARG1 | ARG2

                ARG1 是否為 null,也不是 0,否則為 ARG2

                ARG1 & ARG2

                ARG1 如果參數都不是 null 或 0,否則為 0

                ARG1 < ARG2

                ARG1 小于 ARG2

                ARG1 <= ARG2

                ARG1 小于或等于 ARG2

                ARG1 = ARG2

                ARG1 等于 ARG2

                ARG1 != ARG2

                ARG1 ARG2 不等于

                ARG1 >= ARG2

                ARG1 是大于或等于 ARG2

                ARG1 > ARG2

                ARG1 大于 ARG2

                ARG1 + ARG2

                ARG1 和 ARG2 的算術總和

                ARG1 -ARG2

                ARG1 減 ARG2 的算術差

                ARG1 * ARG2

                ARG1 和 ARG2 的算術積

                ARG1 / ARG2

                ARG1 除以 ARG2 的算術商

                ARG1 % ARG2

                ARG1 除以 ARG2 的算術余數

注意:算數運算格式內各參數彼此之間必須有空格,并且shell腳本不支持浮點型

增強型賦值:

       變量做某種算數運算后回存至此變量中;

            eg:  

               let i=$i+#

               let i+=#

            還有:+=,-=,*=,/=,%=

            自增:

                 VAR=$[$VAR+1]

                 let VAR+=1  

                 let VAR++

            自減:

                 VAR=$[$VAR-1]

                 let VAR-=1

                 let VAR–

         

二、條件測試:

     判斷某需求是否滿足,需要由測試機制來實現;

     如何編寫測試表達式以實現所需的測試;

       (1)執行命令,并利用命令狀態返回值來判斷

          0:成功

          1-255:失敗

       (2)測試表達式

           test EXPRESSION   eg:test 3 -gt 2

            [ EXPRESSION ]

            [[ EXPRESSION ]]

        注意:EXPRESSION兩端必須有空白字符,否則有語法錯誤

bash的測試類型:

          數值測試:數值比較

                 -eq:是否等于;     eg:[ $num1 -eq $sum2 ]

                 -ne:是否不等于

                 -gt:是否大于

                 -ge:是否大于等于

                 -lt:是否小于

                 -le:是否小于等于

          字符串測試:

              ==:是否等于;(字符串)

一個=號也可以由于賦值變量用=號,但是賦值并不應用到[]中,所以能夠使用,但是還是推薦使用雙=號

              >:是否大于

              <:是否小于

             !=:是否不等于

             =~:左側字符串時候能夠被右側的PATTERN所匹配;(模糊匹配而非精確匹配) 

示例:

[root@localhost ~]# [[ tom =~ tom ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ tom =~ om ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ tom =~ o ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ tom =~ x ]]
[root@localhost ~]# echo $?
1

-z "STRING":判斷指定的字符串是否為空,空為真,不空為假

-n "STRING":判斷指定的字符串是否為不空,不空為真,空為假  

注意:(1)字符串測試時:字符串要加引號,表示引用有變量命令"",沒有變量命令使用''

    (2)作比較時,盡量使用[[]];

   (3) 但是在組合測試時,[[]]有時會有語法錯誤,所以可以使用[]

示例:

[root@localhost ~]# [ var1 == var1 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ var1 == Var1 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ var1 == ${Var2} ]
-bash: [: var1: 期待一元表達式
[root@localhost ~]# [ var1 == "${Var2}" ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ a > b]
-bash: [: 缺少 `]'
[root@localhost ~]# [ a > b ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ a < b ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ "a" < "b" ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ "a" > "b" ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ "a" > "b" ]]
[root@localhost ~]# echo $?
1

文件測試:

     存在性測試:

            -a FILE  少使用

            -e FILE 推薦使用

文件存在則為真,否則為假  

存在性及類型測試:

            -b FILE:是否存在并且為塊設備文件;

            -c FILE:是否存在并且為字符設備文件;

            -d FILE:是否存在并且為目錄文件;

            -f FILE:是否存在并且為普通文件;

            -h FILE 或 -L FILE:是否存在并且為符號鏈接文件;

            -p FILE:是否存在并且為管道文件;

            -S FILE:是否存在并且為套接字文件;

文件權限測試:

            -r FILE:是否存在并且對當前用戶可讀;

            -w FILE:是否存在并且對當前用戶可寫;

            -x FILE:是否存在并且對當前用戶可執行;

特殊權限測試:

           -u FILE:是否存在并且擁有suid權限;

           -g FILE:是否存在并且擁有sgid權限;

           -k FILE:是否存在并且擁有sticky權限;

注意:對于腳本則是當前運行此腳本的用戶

文件是否有內容:

          -s FILE:是否有內容;

時間戳測試:

       -N FILE:文件自從上一次讀取操作后是否被修改過

從屬關系測試:

       -O FILE:當前用戶是否為文件的屬主;

       -G FILE:當前用戶是否屬于文件的屬組;

雙目測試:

     FILE 1 -ef FILE2 :FILE1與FILE2是否指向同一個文件系統的相同inode的硬鏈接;

     FILE 1 -nt FILE2 :FILE1的最近一次更新時間是否新于FILE2的最近一次更新時間

     FILE 1 -ot FILE2 :FILE1的最近一次更新時間是否舊于FILE2的最近一次更新時間

組合測試條件:

       邏輯運算:

       第一種方式:

             COMMAND1 && COMMAND2

             COMMAND1 || COMMAND2

             ! COMMAND

            eg: [ -O FILE ] && [ -r FILE ]

       第二種方式:

            test EXPRESSION1 -a EXPRESSION2

            [ EXPRESSION1 -a EXPRESSION2 ]

            [[ EXPRESSION1 -a EXPRESSION2 ]]

類此還有

     EXPRESSION1 -o EXPRESSION2

     ! EXPRESSION

eg:[ -O FILE -a -r FILE ]

注意:模式匹配時,勢必要激活正則表達式引擎,而使用正則表達式的測試判斷,要比單一字符串測試判斷要慢,所以盡量避免使用正則表達式進行查找比較和測試;

腳本的狀態返回值:

           默認是腳本中執行的最后一條件命令的狀態返回值

           自定義狀態退出狀態碼:exit [n]:n為自己指定的狀態碼;

       注意:shell進程遇到exit時,即會終止,因此,整個腳本執行即為結束;

三、bash腳本語句

過程式編程語言的代碼執行順序:

           順序執行:從左至右,從上至下,逐一運行

           選擇執行:代碼有一個分支:條件滿足時才會執行

                 兩個或以上的分支:只會執行其中一個滿足條件的分支

           循環執行:

                 代碼片段(循環體)要執行0、1或多次重復運行

選擇執行:

     單分支的if語句

    if 測試條件;then 

      代碼分支 

      條件為真則執行,為假則不執行

或者

    fi       

    if 測試條件      

     then      

        代碼分支                                     

        條件為真則執行,為假則不執行                                        fi                            

雙分支的if語句:

         if 測試條件;then

           條件為真時執行的分支

         else

           條件為假時執行的分支

         fi

多分支的if語句:

          if COMDITION1;then

            條件1為真分支

          elif COMDITION2;then

              條件2為真分支

          elif COMDITION3;then

             條件3為真分支

          …

          elif COMDITIONn;then

             條件n為真分支

          else

             所有條件均不滿足時的分支

          fi

注意:即便多個條件可能同時都能滿足,分支只會執行其中一個,首先測試為“真”;并且if語句可嵌套if等其他語句

case語句的語法格式:

    case $VARAIBLE in

    PATH1)

          分支

          ;;

    PATH2)

          分支

          ;;

    …

    *)

          分支

          ;;

    esac

    注意:雙分號如果不加,則會前一個匹配執行后,下一個會接著匹配執行

          適用于一個變量,與多個可能取值比較

          支持glob風格的通配符:

                         *:任意長度的任意字符;

                         ?:任意單個字符

                         []:范圍內任意個字符

                         a|b:a或b;

bash腳本編程之用戶交互:

    腳本參數

       用戶交互:通過鍵盤輸入數據,從而完成變量賦值操作

           read [option]…[name…]

                  -p 'PROMPT'    提示注釋信息

                  -t TIMEOUT     時間限制

       bash -n /path/to/some_script

               檢測腳本中的語法錯誤

       bash -x /path/to/some_script

               調試執行

循環執行:將一段代碼重復執行0、1或多次;

     進入條件:條件滿足時才進入循環

     退出條件:每一個循環都應該有退出條件,以有機會退出循環

bash腳本:

     for循環

     while循環

     until循環

for循環:

       執行機制:依次將列表中的元素賦值給“變量名” ; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束

   兩種格式:

     (1)遍歷列表

     (2)控制變量

    遍歷列表

        for VARAIBLE in LIST;do

             循環體

        done

    進入條件:LIST列表有元素,即可進入循環

    退出條件:列表中的元素遍歷完成

    LIST的生成方式:

         (1)直接給出;

         (2)整數列表

                  (a){start…end}

                  (b)seq [start [incremtal]] last

          (3)返回列表的命令:$(COMMAND),例如:ls  cat

         (4)glob通配符

         (5)變量引用;例如$@,$*

    格式示例:

    #!/bin/bash

    #

    for username in user1 user2 user3;do

        if id $username &>/dev/null;then

           echo "$username exists."

        else

           useradd $username && echo "Add user $username finished."

        fi

    done

    示例:求100以內的正整數之和

    #!/bin/bash

    #

    delcare -i sum=0

    for i in {1..100};do

        echo "\$sum is $sum,\$i is $i"

        sum=$[$sum+$i]

    done

    echo $sum

    示例:判斷/var/logm目錄下的每一個文件的內容類型

    #!/bin/bash

    #

    for filename in /var/log/*;do

    if [ -f $filename ];then

       echo "Common file."

    elif [ -L $filename ];then

       echo "Sysbolic link"

    elif [ -d $filename ];then

       echo "Directory."

    elif [ -b $filename ];then

       echo "block special file."

    elif [ -c $filename ];then

       echo "character special file."

    elif [ -S $filename ];then

       echo "Socket file."

    else

       echo "Unkown."

    fi

    done

while循環:

     while CONDITION;do

           循環體

           循環控制變量修正表達式

     done

     

     CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環,因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正

     進入條件:CONDITION測試為“真”

     退出條件:CONDITION測試為“假”

     示例:求100以內的正整數之和

     #!/bin/bash

     #

     declare -i sum=0

     declare -i i=1

     while [ $i -le 100 ];do

          sum=$[$sum+$i]

          let i++

     done

     echo $sum

1、編寫腳本/root/bin/createuser.sh,實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶的id號等信息

#!/bin/bash
#寫一個腳本/root/bin/createuser.sh,實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存
在,就顯示其存在,否則添加之;顯示添加的用戶的id 號等信息
[[ -z $1 ]] && echo "請輸入一段字符串作為用戶名"&& exit
if grep -E "^$1:" /etc/passwd &>/dev/null;then
     echo "s1:已經存在此用戶"
     exit
else
     useradd $1
     id $1
     echo "用戶已經幫您添加"
     exit
fi

2、編寫腳本/root/bin/yesorno.sh,提示用戶輸入yes或no,并判斷用戶輸入的是yes還是no,或是其它信息

#!/bin/bash
#提示用戶輸入yes或no, 并判斷用戶輸入的是yes 還是no,或是其它信息
[[ -z $1 ]] && echo "請輸入一段字符串" && exit
var=`echo "$1" | tr "[[:lower:]]" "[[:upper:]]"` 
if [[ ${var} =~ "YES" ]];then
     echo "用戶輸入的是$1"
elif [[ ${var} =~ "NO" ]];then
     echo "用戶輸入的是$1"
else
     echo "用戶輸入的是其它信息"
fi
unset var

3、編寫腳本/root/bin/filetype.sh,判斷用戶輸入文件路徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)

#!/bin/bash
if [[ $# -lt 1 ]]
then
    echo -e "Error: No argument.\n\tUsage: $0 FILENAME"
    exit 1
else
    if [[ ! -e $1 ]]
    then
        echo "$1: No such file or diretory"
    elif [[ -d $1 ]]
    then
        echo "$1 is a diretory"
    elif [[ -L $1 ]]
    then
        echo "$1 is a link file"
    elif [[ -f $1 ]]
    then
        echo "$1 is a common file"
    fi
fi

4、編寫腳本/root/bin/checkint.sh,判斷用戶輸入的參數是否為正整數

#!/bin/bash
read -p "請入一個數字:" num
[ -z "$num" ]&&echo "請輸入一個數字"&&exit 1
NUM=$(echo $num |grep -Eo "\-?[[:digit:]]+")
if [ "$NUM" == "$num" ];then
         if [ "$NUM" -lt "0" ];then
                echo "您輸入的是一個負整數!"
        elif [ "$NUM" -eq "0" ];then
                echo "您輸入的是一個0!"
        else
                echo "恭喜,您輸入的是一個正整數!"
        fi
else
        echo "您輸入的不是一個整數,請重新運行腳本!"
fi

練習:用for實現
1、判斷/var/目錄下所有文件的類型

#!/bin/bash
cd $1 &> /dev/null
# diretory judge
if [[ $? = 0 ]]
then

    for i in `ls -A $1`
    do
        FileType=`ls -dl $DirName/$i | cut -c1`
        case $FileType in
            d)
                echo "$i is a diretory."
                ;;
            -)
                echo "$i is a common file."
                ;;
            l)
                echo "$i is a link file."
                ;;
            b)
                echo "$i is a block file."
                ;;
            c)
                echo "$i is a character file."
                ;;
            p)
                echo "$i is a pipe file."
                ;;
            s)
                echo "$i is a socket file."
                ;;
            *)
                echo "$i is other file"
                ;;
        esac
    done
else
    echo "$1 is not a diretory"
    exit 2
fi


unset DirName
unset FileType

2、 添加10個用戶user1-user10,密碼同用戶名

#/bin/bash
if [[ $# -lt 1 ]]
then
    echo -e "Error: No option \n\t-d\tdelete user1-user10\n\t-a\tadd user1-user10 "
    exit 1
fi

for i in $(seq 10);do
    case $1 in 
        -d|--del)
            if id user$i &> /dev/null;then
                userdel -r user$i
                echo "user$i: Delete complete!"
            else
                echo "user$i: No such user!"
            fi
            ;;
        -a|--add)
            if id user$i &> /dev/null;then
                echo "user$i"| passwd --stdin "user$i" &> /dev/null
                echo -e  "user$i: Already existed!\nAnd authentication tokens updated successful!"
            else
                useradd user$i &> /dev/null
                echo "user$i"| passwd --stdin "user$i" &> /dev/null
                echo " user$i: Add complete!"
            fi
            ;;
        *)
            echo "Error:"
            echo -e "$0 : Unknow option!\nplease use '-a''--add' to add user or '-d''--dell'to delect user"
            exit 1
            ;;
    esac
done

3、 /etc/rc.d/rc3.d目錄下分別有多個以K開頭和以S開頭的文件;分別讀取每個文件,以K開頭的文件輸出為文件加stop,以S開頭的文件輸出為文件名加start;
“ K34filename stop”
“S66filename start”

#!/bin/bash
for i in `ls /etc/rc.d/rc3.d`
do
    FileC1=`echo $i | cut -c1`
    case $FileC1 in
        K)
            echo -e "$i\tstop"
            ;;
        S)
            echo -e "$i\tstart"
            ;;
        *)
            echo "unkown file"
            ;;
    esac
done

4、編寫腳本,提示輸入正整數n的值,計算1+2+3+…n的總和

#!/bin/bash
#
    delcare -i sum=0
    for i in {1..$1};do
        echo "\$sum is $sum,\$i is $i"
        sum=$[$sum+$i]
    done
    echo $sum

5、編寫腳本,提示請輸入網絡地址,如192.168.0.0,判斷輸入的網段中主機在線狀態

#!/bin/bash
# 寫一個腳本,提示請輸入網絡地址,如 192.168.0.0 ,判斷輸入的網段中主機在線狀態

# only for netmask 255.255.255.0
echo -n "Enter IP:"
read IP
#get IP segment
Segment=`echo $IP | cut -d. -f1-3 `.
#
if echo $IP | 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])\.){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' &>/dev/null
then
    #test only  5 host
    for i in `seq 240 255`
    do
        if ping -c 1 -W 1 $Segment$i &> /dev/null
        then
            echo -e "$Segment$i\tonline"
        else
            echo -e "$Segment$i\toffline"
        fi
    done
else
    echo "$IP is invalid"
fi

6、 打印九九乘法表

#!/bin/bash
#
for i in {1..9};do
    for j in $(seq 1 $i);do
        echo -n -e "$j*$i=$[$j*$i]\t"
    done
        echo
done

用while實現
1、 編寫腳本,求100以內所有正整數之和

#!/bin/bash
#
     declare -i sum=0
     declare -i i=1
     while [ $i -le 100 ];do
          sum=$[$sum+$i]
          let i++
     done
     echo $sum

2、 編寫腳本,通過ping命令探測172.16.250.1-254范圍內的所有主機的在線狀態,統計在線主機和離線主機各多少。

#!/bin/bash
#
a="10.1.252."
i=0
j=0
k=0
while [ $i -le 255 ];do
	ping -c1 -W1 $a$i &> /dev/null
	if [ $? -eq 0 ];then
		echo "$a$i is active"
		
		let j++
	else
		echo "$a$i is inactive"
		let k++
	fi
	let i++
done
echo "the sum number of active users is $j"
echo "the sum number of inactive users is $k"

3、 編寫腳本,打印九九乘法表

#!/bin/bash
#function: 9*9 tables
#author: xiaoshui
i=1
while [ $i -le 9 ];do
	j=1
	while [ $j -le $i ];do
		mul=$[$i*$j]
		echo -ne "$i*$j=$mul\t"
		j=$[$j+1]
	done
	echo 
	i=$[$i+1]
done

4、 編寫腳本,利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者

#!/bin/bash
#
i=10
a=$RANDOM
max=$a
min=$a
while [ $i -ge 1 ]
do
	[ $max -lt $a ] && max=$a
	[ $min -gt $a ] && min=$a
	echo "$a"
	a=$RANDOM
	let i--
done
echo "最大值$max"
echo "最小值$min"

5、編寫腳本,實現打印國際象棋棋盤

#!/bin/bash
#
#
#
i=1

while [ $i -le 8 ];do
	j=1
	while [ $j -le 8 ];do
		sum=`expr $i + $j`
		z=`expr $sum % 2`
		[ $z -eq 0 ] && echo -ne "\033[41;1m  \033[0m"||echo -ne "\033[43;1m  \033[0m"
		let j++
	done
	echo
	let i++
done
#!/bin/bash
#
declare -i i=1
declare -i j=1
while [ $i -lt 9 ];do
	if [ $[$i%2] -eq 0 ] ;then
		 while [ $j -lt 9 ];do
                	if [ $[$j%2] -ne 0 ];then
                        	echo -en "\e[43;37m  \e[0m"
                	else
                        	echo -en "\e[45;37m  \e[0m"
                	fi
                	let j++
        	done
	else 
		while [ $j -lt 9 ];do
			if [ $[$j%2] -eq 0 ];then	
				echo -en "\e[43;37m  \e[0m"
			else 
				echo -en "\e[45;37m  \e[0m"
			fi
			let j++
		done
		fi
	declare -i j=1
	let i++
	echo ""
done	
unset i;unset j

1、每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶hacker登錄,則將登錄時間和主機記錄于日志/var/log/login.log中,并提示該用戶退出系統。

#!/bin/bash
#function: check hacker login and hint logout
until who |grep -q "^hacker\b" ;do
	sleep 3
done
who | grep "^hacker"|tr -s ' '|cut -d' ' -f3,5 >> /var/log/login.log
echo "you should logout system" | mail hacker
echo "reminded and login record in /var/log/login.log"	

2、隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出。

#!/bin/bash
suiji=$[$RANDOM%10+1]
read -p "請輸入數字:" num
until [[ $suiji -eq $num ]]; do
	[ $shuru -lt $suiji ] && echo "小了,往大了猜" 
	[ $shuru -gt $suiji ] && echo "大了,往小了猜"
	read -p "請再次輸入數字:" num
done
echo "恭喜你猜中了?。?!"

1、寫個腳本:

   *
  ****
 ********
************

1 4

1,3空格1個*

2,2空格2個*

3,1空格,3*

n行空格數=總行數-n

n行*數=2n-1

#!/bin/bash
#
#打印三角形
#獲取終端寬度
termCols=`tput cols`

#根據終端寬度,判斷出能夠正常打印三角形的行數;
maxLineNum=`seq 1 2$termCols |wc -l`

echo -e "#當終端的寬度最多能夠正常打印$maxLineNum行\n#請輸入要打印的三角形行數"
read -p "#行數范圍大于1小于等于$maxLineNum,請輸入行數:" lineNeeds

[[ `tput cols` -ne $termCols ]] && echo "終端寬度已經被改變,請重新運行腳本" &&exit 1

[[ $lineNeeds =~ ^[[:digit:]]+$ && $lineNeeds -ge 2 && $lineNeeds -le $maxLineNum ]]

[[ $? -ne 0 ]] && echo "輸入值不合法" && exit
for line in `seq 1 $lineNeeds`;do
    #打印當前行的空格
    for((kong=(lineNeeds-line);kong>0;kong--));do
             echo -n " "
    done
    #打印當前行的星號
    for((xing=1;xing<=(line*2-1);xing++));do
             echo -n "*"
    done
    echo
done

2、用until循環實現國際象棋棋盤

#!/bin/bash
#
#
#
i=1

until [ $i -gt 8 ];do
	j=1
	while [ $j -gt 8 ];do
		sum=`expr $i + $j`
		z=`expr $sum % 2`
		[ $z -eq 0 ] && echo -ne "\033[41;1m  \033[0m"||echo -ne "\033[43;1m  \033[0m"
		let j++
	done
	echo
	let i++
done

原創文章,作者:NameLess,如若轉載,請注明出處:http://www.www58058.com/39029

(0)
NameLessNameLess
上一篇 2016-08-24
下一篇 2016-08-24

相關推薦

  • 第二周作業

    第二周

    Linux干貨 2017-12-11
  • 強大的文本處理工具:vim編輯器

    一:引言 系統管理員的重要工作就是修改與設置某些軟件的重要配置文件,而vim作為vi編輯器的升級版本,不僅能夠以不同顏色來顯示文字內容,還能夠進行諸如shell腳本、C等程序的編寫,所以,它還是一個程序編輯器,接下來,就讓我們一起來看看vim的有哪些好玩的用法和特征。 二:vim三種模式及其常見用法 雖然vim有非常龐大甚至說它復雜也不為過的功能體系,但用結…

    2017-08-05
  • 網絡屬性配置(二)

    本文接上篇。。。 ip address -protocol address management. ip address add -add new protocol address   ip addr add IFADDR   label NAME :為額外添加的地址指明接口別名    [broadcast ADDRE…

    Linux干貨 2017-01-02
  • N26-第一周

    描述計算機的組成及功能。 計算機主要由運算器,控制器,存儲器,輸入、輸出設備五大部件組成 運算器(Arithmetic Logic Unit, ALU):實現各種算數運算和邏輯運算(與控制器組成cpu)。 控制器(Control Unit, CU):計算機控制中心,根據程序規定的控制程序進行解釋,根據要求進行調度,控 制協調各部分有條不紊的運行。 存儲器(M…

    Linux干貨 2017-02-03
  • 磁盤配額、軟RAID使用、LVM管理

    一.磁盤配額的相關知識 (1)工作原理及方式         *以文件系統為單位啟動         *以特定的用戶或組為對象       …

    Linux干貨 2016-09-06
  • N22-北京-追求極境之人-RSYNC差分編碼同步原理

    1客戶端發送自己的filelist,filelist包含文件hashindexid(alert32)和關聯的文件chunkChecksum(MD5)和hashindexID以便進行快速查找,chunksize根據文件大小進行等分,不足均值部分直接發送不進行MD5校驗值生成 發送進程一次從生成器讀取一個文件索引號和關聯的塊校驗集合 2對于生成器發送的每個文件I…

    Linux干貨 2016-08-22
欧美性久久久久