Bash腳本條件判斷和控制流結構

Bash位置參數

有兩種簡單的方法可以將用戶輸入讀入bash中的變量。第一個方法是使用read提示用戶輸入(使用-p選項)並將其直接存儲到一個或多個變量。

交互式

read -p ‘Enter your first and last name: ’ FIRST LAST
-p表示顯示交互內容,如不顯示則在最後加-s(可用於密碼輸入不回顯)

[root@localhost ~]# read -p 'please give me a num: ' a
please give me a num: 2
[root@localhost ~]# echo $a
2
[root@localhost ~]# read -p 'please give me a num: ' -s a
please give me a num: [root@localhost ~]# echo $a
24

這裏寫圖片描述

位置參數

另一個方法是使用位置參數來讀取傳遞給腳本的命令行參數或選項輸入。
指定的位置參數總數:$#
位置參數自身:$0、$1、$2、$3….
所有位置參數: $@、$*

退出狀態

Linux命令完成時,將返回退出狀態。成功完成程序時,將返回0的推出狀態。這被bash當作邏輯True值。非零退出狀態通常表示發生了錯誤,並且被bash當作邏輯False值。
例如:grep的退出狀態的含義:
0 – 在指定的文件中找到了模式
1 – 在指定的文件中未找到模式
>1 – 一些其他錯誤(無法打開文件、錯誤的搜索表達式等)
推出狀態的值被存儲在”?”中,可以使用以下命令查看:
echo $?
這裏寫圖片描述

test條件判斷

test命令可用於評估bash腳本中的表達式。它評估其參數所指定的表達式,如果表達式
爲true,返回零退出狀態,如果表達式爲false,則返回非零退出狀態。

非零或零長度字符串運算符

{-n | -z}
-n表示不爲0
-z表示爲0

[root@localhost ~]# a=1
[root@localhost ~]# test -n "$a" ;echo $?
0
[root@localhost ~]# test -z "$a" ;echo $?
1
[root@localhost ~]# [ -n "$a" ]&& echo yes || echo no ##若a不爲0則顯示yes,否則顯示no
yes
[root@localhost ~]# [ -z "$a" ]&& echo yes || echo no ##若a爲0則顯示yes,否則顯示no
no

這裏寫圖片描述

字符串比較運算符:= !=

[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# [ "$a" = "$b" ]&& echo yes || echo no ##a=b則顯示yes,否則顯示no
no
[root@localhost ~]# b=1
[root@localhost ~]# [ "$a" = "$b" ]&& echo yes || echo no
yes
[root@localhost ~]# [ "$a" != "$b" ]&& echo yes || echo no
no
[root@localhost ~]# b=2
[root@localhost ~]# [ "$a" != "$b" ]&& echo yes || echo no
yes
[root@localhost ~]# [ ! "$a" = "$b" ]&& echo yes || echo no   ##當!在條件語句前表示條件不成立,這裏表示若a=b不成立則顯示yes,否則顯示no
yes

這裏寫圖片描述

數字比較運算符

-eq 等於(=)
-ne 不等於(!=)
-lt 小於
-le 小於等於
-gt 大於
-ge 大於等於

[root@localhost ~]# a=1
[root@localhost ~]# b=4
[root@localhost ~]# [ "$a" -eq "$b" ]&& echo yes || echo no
no
[root@localhost ~]# b=1
[root@localhost ~]# [ "$a" -eq "$b" ]&& echo yes || echo no
yes
[root@localhost ~]# b=2
[root@localhost ~]# [ "$a" -ne "$b" ]&& echo yes || echo no
yes
[root@localhost ~]# [ "$a" -lt "$b" ]&& echo yes || echo no
yes
[root@localhost ~]# [ "$a" -gt "$b" ]&& echo yes || echo no
no

這裏寫圖片描述

文件狀態運算符

-b 塊文件
-c 字符文件
-e 文件存在
-f 常規文件
-d 目錄
-r 可讀文件
-w 可寫
-x 可操作
-s 大小不爲0的文件
-S 套接字文件
-L 鏈接文件
這裏寫圖片描述

二進制文件運算符

file1 -ef file2文件在同一個端口或設備
**file1 -nt file2**file1比file2新
**file1 -ot file2**file1比file2舊
這裏寫圖片描述

邏輯運算符

-o or或者
-a and和
! 非
&& 正確則
|| 錯誤則

if語句

if命令檢查if後面的命令或列表的退出值。如果第一個命令評估爲true/零,則運行then之後的命令列表,直至任一else。如果第一個命令評估爲false/非零,則運行else與fi之間的命令列表(反向平寫if,標記if塊的結束)。
語法:
(1)
if command; then command; command2; else command3; fi
(2)
if command; then command; elif command2;then commend3; else command4; fi

例:

#!/bin/bash
read -p "please input your num: " a
if [ -z "$a" ]
then
        echo no a
elif [ "$a" = "1" ]
then
        echo hello world $a
else
        echo i have no idea
fi

這裏寫圖片描述

測試:
這裏寫圖片描述

case語句

case語句 :它能夠把變量的內容與多個模板進行匹配,再根據成功匹配的模板去決定應該執行哪
部分代碼。
case .. in
..) ##條件1
;;
..) ##條件2
;;
esac ##結束點

例:

#!/bin/bash
case $1 in
start)
systemctl start firewalld
;;
stop)
systemctl stop firewalld
;;
esac

這裏寫圖片描述

expect語句

在shell中利用expect實現自動應答腳本。
例:
利用自動應答腳本實現ssh自動連接
#!/usr/bin/expect
這一行告訴操作系統腳本里的代碼使用那一個shell來執行。
spawn是expect的內部命令,作用是給後面的shell指令加個殼,用來傳遞交互指令
expect eof
作用是在輸出中搜索文件結束符,如果沒有這一行,腳本會立即退出,得不到正確結果。
interact
執行完成後保持交互狀態,把控制權交給控制檯,這個時候就可以手工操作了。否則退出登錄。
$argv 參數數組
expect腳本可以接受從bash傳遞過來的參數.可以使用[lindex $argv n]獲得,n從0開始,分別表示第
一個,第二個,第三個….參數。

#!/usr/bin/expect
set IP [ lindex $argv 0]   ##定義命令後的輸入的第一個字符爲IP
set PASS [ lindex $argv 1] ##定義命令後的輸入的第二個字符爲PASS
spawn ssh root@$IP
expect {
        "yes/no" {send "yes\r";exp_continue}
        "password:" {send "$PASS\r"}
}
interact

這裏寫圖片描述

測試:
這裏寫圖片描述

環境變量

shell和腳本使用變量來存儲數據 ,有些變量可以連同它們的內容傳遞給子進程,這些
變量我們稱之爲環境變量。
使用env命令顯示所有環境變量
使用set命令現實所有本地定義的shell變量
系統環境變量文件/etc/profile
用戶環境變量文件~/.bash_profile

Bash啓動腳本

(1)修改系統環境變量__用於系統
這裏寫圖片描述

這裏寫圖片描述

(2)修改用戶環境變量——僅用於本用戶
這裏寫圖片描述

這裏寫圖片描述

(3)當系統環境變量和用戶環境變量設定不一樣時,按最後讀取的環境變量即用戶環境變量。

使用別名

alias命令可以用來自定義屬於自己的系統命令,寫入~/.bashrc 文件永久生效
(1)添加別名
這裏寫圖片描述

這裏寫圖片描述
(2)刪除別名
刪除文件中的別名
unalias 別名
這裏寫圖片描述

使用函數

函數名 () {
commends
}

腳本示例

check_ip主機檢測

存在則顯示丿,否則顯示down
且沒有給出ip時會提示

#!/bin/bash
while [ "$#" -eq "0" ]
do
        echo "please input a IP address!!!"
        exit 1
done
ping -c1 $1 &>/dev/null && echo "the $1 is up" || echo "the $1 is down" 

這裏寫圖片描述

測試:
這裏寫圖片描述

check_ip.sh主機檢測

check_ip主機檢測的另一種實現

#!/bin/bash
[ -n "$1" ]&& (
        ping -c1 -w1 $1 &> /dev/null && echo "$1 is up " || echo "$1 is down")||(echo "please give me a address!")

這裏寫圖片描述

測試:
這裏寫圖片描述

ip_check本機地址的查看

實現可以查看本地的ip地址,且會顯示可查看的設備
awk ‘{print $1}‘ 表示取出輸入的第一串字符
-F : 表示不取出:符號

#!/bin/bash
echo "you can input these interface: " 
ifconfig  | grep flags | awk -F: '{print $1}'
read -p "please give me a interface: " a
ifconfig $a | grep netmask | awk '{print $2}'

這裏寫圖片描述

測試:
這裏寫圖片描述

check_file.sh檢測文件的類型

實現可以檢測文件的類型

#!/bin/bash
        while [ -z "$*" ]
        do
        echo "please give me a file or directory"
        exit 0
        done

        if [ -e "$1" ]
        then

        while [ -b "$1" ]
        do
        echo "It's a block file "
        exit 1
        done

        while [ -c "$1" ]
        do
        echo "It's a character file "
        exit 1
        done

        while [ -d "$1" ]
        do
        echo "It's a directory "
        exit 1
        done

        while [ -S "$1" ]
        do
        echo "It's a socket file "
        exit 1
        done
        while [ -L "$1" ]
        do
        echo "It's a link file "
        exit 1
        done

        while [ -f "$1" -a ! -L "$1" ]
        do
        echo "It's a file "
        exit 1
        done

        while [ -x "$1" ]
        do
        echo "the file can be exced "
        exit 1
        done

        else
        echo "It's not exists"
        exit 1
        fi

測試:
這裏寫圖片描述

用戶建立

(1)create_user.sh
建立用戶並設置密碼爲westos
已建立的用戶提示已存在

#!/bin/bash
if [ -z "$*" ]
then
        echo "please give me a user file"

elif [ ! -e "$*" ]
then
        echo "$1 is not exist"
else
        for USER in `cat $1`
        do
        id $USER &> /dev/null && (
        echo "$USER is exist,$USER's passwd is changing"
        echo westos | passwd --stdin $USER &> /dev/null) || (
        useradd $USER
        echo westos | passwd --stdin $USER &> /dev/null
        echo "$USER is creating")
        done
fi

測試:
這裏寫圖片描述

(2)ctrl_user.sh
完善create_user.sh,使可以提示沒有文件時的情況,可以批量刪除用戶

#!/bin/bash
if [ "$1" = "create" ]
then

        if [ -z "$2" ]
        then
                echo "please give me a user file"

        elif [ ! -e "$2" ]
        then
                echo "$2 is not exist"
        else
                for USER in `cat $2`
                do
                id $USER &> /dev/null && (
                echo "$USER is exist"
                echo westos | passwd --stdin $USER &> /dev/null) || (
                useradd $USER
                echo westos | passwd --stdin $USER &> /dev/null)
                done
        fi
elif [ "$1" = "delete" ]
then
        if [ -z "$2" ]
        then
                echo "please give me a user file"

        elif [ ! -e "$2" ]
        then
                echo "$2 is not exist"
        else
                for USER in `cat $2`
                do
                userdel -r $USER &> /dev/null
                echo "$USER is not exist "
                done
        fi
else
        echo "USAGE: /mnt/ctrl_user.sh [ create|delete ] userfile "
fi

測試:
這裏寫圖片描述

(3)ctrl_user
ctrl_user.sh的利用函數實現的另一種方式

#!/bin/bash
ACTION () {
if [ -z "$4" ]
        then
        echo "please give me a user file"

        elif [ ! -e "$4" ]
        then
                echo "$4 is not exist"
        else
                for NAME in `cat $4`
                do
                        USER=`getent passwd $NAME`
                        if [ $1 "$USER" ]
                        then
                                $2 $NAME
                                [ "$2" = "useradd" ]&&(echo westos | passwd --stdin $NAME &> /dev/null)
                        else
                                echo "$NAME is exist"
                        fi
                done
        fi
}

if [ "$1" = "create" ]
then
        ACTION -z "useradd" "exist" $2
elif [ "$1" = "delete" ]
then
        ACTION -n 'userdel -r' 'not exist' $2
else
        echo "USAGE: /mnt/ctrl_user.sh [ create|delete ] userfile "
fi

測試:
這裏寫圖片描述

check_num.sh比較兩個數的和是否大於10

#!/bin/bash
while [  -z "$1" -o -z "$2" ]
do
        echo "please give me two number"
        exit 1
done
let A=$1+$2
[ "$A" -le "10" ] && echo "$1+$2's sum is equal or lesser than 10,and the sum is $A" || echo "$1+$2's sum is larger than 10" 

測試:
這裏寫圖片描述

發佈了87 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章