1. 程式人生 > >3-unit12 腳本2

3-unit12 腳本2

enter linux false 程序 用戶

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

**Bash位置參數和退出狀態

**條件判斷和控制流結構


#####Bash位置參數######
有兩種簡單的方法可以將用戶輸入讀入bash中的變量。第一個方法是使用read提示用戶輸入(使用-p選項)並將其直接存儲到一個或多個變量:
交互式輸入
# read -p ‘Enter your first and last name: ‘ FIRST LAST
另一個方法是使用位置參數來讀取傳遞給腳本的命令行參數或選項輸入。各種特殊變量存儲傳遞的選項編號

Bash解析的個別參數或整個原始命令行。
指定的位置參數總數:$#
位置參數自身:$0、$1、$2、$3....

所有位置參數: [email protected]$*


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


########test條件判斷########
test命令可用於評估bash腳本中的表達式。它評估其參數所指定的表達式,如果表達式為true,返回零退出狀態,如果表達式為false,則返回非零退出狀態。test具有替代語法,使用方括號"[]"將表達式括起來,這樣更易於閱讀。

語法:test EXPRESSION 或 [EXPRESSION]


######非零或零長度字符串運算符:test -{n|z} STRING
[[email protected] ~]# [ -n westos ]; echo $? ##westos非零
0
[[email protected] ~]# [ -z westos ]; echo $? ##westos等於零
1


技術分享

技術分享技術分享

##測試:

技術分享


####字符串比較運算符:=、!=
[[email protected] ~]# [ abc = abc ]; echo $? ##相等
0
[[email protected] ~]# [ abc = ABC ]; echo $?
1
[[email protected] ~]# [ abc != ABC ]; echo $? ##不等於
0
技術分享


####數字比較運算符:-eq、-ne、-lt、-le、-gt、-ge

##-ge 大於等於

##-le 小於等於

##-lt 小於

[[email protected] ~]# [ 1 -eq 1 ]; echo $? ##等於
0
[[email protected] ~]# [ 1 -ne 1 ]; echo $? ##不等
1
[[email protected] ~]# [ 1 -gt 2 ]; echo $? ##大於
1

技術分享

技術分享

技術分享



######文件狀態運算符:test -{b|c|e|f|d|r|w|x|s|L} FILE/DIRECTORY

##-s 判斷文件是空文件

##-S 判斷文件是套字節

##-x 判斷文件是可執行文件


[[email protected] ~]# [ -b /dev/sda ]; echo $? ##-b 判斷文件是塊設備

1
[[email protected] ~]# [ -c /dev/zero ]; echo $? ##-c 判斷文件是字符設備

0
[[email protected] ~]# [ -e /etc/passwd ]; echo $? ##-e 判斷文件是否存在

0
[[email protected] ~]# [ -f /etc/passwd ]; echo $? ##-f 判斷文件是文件
0
[[email protected] ~]# [ -d /etc/passwd ]; echo $? ##-d 判斷文件是目錄
1
[[email protected] ~]# [ -L /etc/passwd ]; echo $? ##-L 判斷文件是鏈接
1

技術分享

技術分享

技術分享


#####二進制文件運算符:-ef、-nt、-ot
[[email protected] bin]# [ /bin/mount -ef /usr/bin/mount ]; echo $?
0
[[email protected] bin]# [ /bin/mount -nt /usr/bin/mount ]; echo $?
1
[[email protected] bin]# [ /bin/mount -ot /usr/bin/mount ]; echo $?
1
######邏輯運算符:-o、-a、!、&&、||
[[email protected] bin]# [ 2 -gt 1 -a 1 -gt 2 ]; echo $? ##2大於1並且1大於2
1
[[email protected] bin]# [ 2 -gt 1 -o 1 -gt 2 ]; echo $? ##2大於1或者1大於2
0
[[email protected] bin]# [ ! 2 -gt 1 ]; echo $? ##(2大於1)取反
1


######if語句
if命令檢查if後面的命令或列表的退出值。如果第一個命令評估為true/零,則運行then之後的命令列表,直至任一else。如果第一個命令評估為false/非零,則運行else與fi之間的命令列表(反向平寫if,標記if塊的結束)。
語法:if command; then command; command2; else command3; fi
示例:
if test “$USER” != ‘root‘ ; then
echo you are not logged in as root
fi
if [ $(id -u) -lt 9 ] ; then
echo “The number $(id -u) is less than 9!”
fi

if grep “^${USER}:” /etc/passwd &> /dev/null ; then
echo “${USER} is a local user on the system.”
else
echo “${USER} is not a local user.”
fi
systemctl is-active mariadb > /dev/null 2>&1 ; MARIADB_ACTIVE=$?
systemctl is-active postgresql > /dev/null 2>&1 ; POSTGRESQL_ACTIVE=$?
if [ $MARIADB_ACTIVE -eq 0 ];then
mysql
elif [ $POSTGRESQL_ACTIVE -eq 0 ];then
psql
else
sqlite3
fi


技術分享

技術分享

技術分享

技術分享

技術分享

技術分享


調用函數:

技術分享

技術分享

技術分享

測試:

技術分享


#########case語句######
case語句 :它能夠把變量的內容與多個模板進行匹配,再根據成功匹配的模板去決定應該執行哪部分代碼。
case "$1" in
start)
systemctl start $2
;;
stop)
systemctl stop $2
;;
reload|restart)
systemctl stop $2
systemctl start $2
;;
*)
echo "Usage: $0 (start|stop|restart|reload)"
;;
esac


######expect語句#######
在shell中利用expect實現自動應答腳本。
# cat talk
echo "who are you?"
read who
echo "hello, $who"
echo "are you
happy?"
read answer
echo "why?"
read answer

技術分享


# cat auto
#!/usr/bin/expect
#set timeout 10
spawn ./talk
expect "who"
send "firefly\n"
expect "happy?"
send "Yes,I am happy.\n"
expect "why?"
send "任性!\n"
expect eof
exit

解釋:

#!/usr/bin/expect ##這一行告訴操作系統腳本裏的代碼使用哪一個shell來執行。
set timeout 10 ##設置後面所有的expect命令的等待響應的超時時間,單位為秒。
spawn talk ##spawn是expect的內部命令,作用是給後面的shell指令加個殼,用來傳遞交互指令。
expect "who" ##判斷上次輸出結果裏是否包含“who”的字符串,如果有則立即返回,否則等待超時時間後返回。
send "westos\n" ##執行交互動作,相當於手工輸入"westos"。
expect eof ##作用是在輸出中搜索文件結束符,如果沒有這一行,腳本會立即退出,得不到正確結果。
interact ##執行完成後保持交互狀態,把控制權交給控制臺,這個時候就可以手工操作了。否則退出登錄。
$argv 參數數組 ##expect腳本可以接受從bash傳遞過來的參數.可以使用[lindex $argv n]獲得,n從0開始,分別表示第一個,第二個,第三個....參數。

技術分享

測試:

技術分享

技術分享

測試:技術分享

技術分享

技術分享

技術分享

測試:

技術分享

####查詢1號主機用戶名

技術分享

技術分享


技術分享

測試:查詢1號和100號主機的用戶名

技術分享

技術分享

測試:技術分享

技術分享

技術分享

測試;

技術分享

技術分享

技術分享

測試:查詢cpu利用率

技術分享



########環境變量#######
shell和腳本使用變量來存儲數據 ,有些變量可以連同它們的內容傳遞給子進程,這些
變量我們稱之為環境變量。
[[email protected] ~]# LINUX=redhat
[[email protected] ~]# echo $LINUX
redhat
[[email protected] ~]# bash
[[email protected] ~]# echo $LINUX
[[email protected] ~]# exit
exit
[[email protected] ~]# export LINUX
[[email protected] ~]# bash
[[email protected] ~]# echo $LINUX
redhat
[[email protected] ~]# exit
exit




#####使用env命令顯示所有環境變量#######
使用set命令現實所有本地定義的shell變量
Bash啟動腳本
在用戶登錄的時候,會運行全局變量文件/etc/profile,和用戶自定義變量文件
~/.bash_profile去初始化它們的環境變量。
/etc/profile
\_ /etc/profile.d/*.sh
~/.bash_profile
\_ ~/.bashrc
\_ /etc/bashrc

技術分享

技術分享



使用別名
alias命令可以用來自定義屬於自己的系統命令,寫入~/.bashrc 文件永久生效。
查看別名:
# alias
alias ls=‘ls --color=auto‘
alias mv=‘mv -i‘
alias rm=‘rm -i‘
...
設置別名:
# alias mycom=‘echo hello;hostname‘
# mycomm
hello
server0.example.com
刪除別名: unalias mycomm
使用函數
pathmunge () {
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
}
...
if [ "$EUID" = "0" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi

技術分享

3-unit12 腳本2