Bash腳本基礎
BASH = GNU Bourne-Again Shell,BASH 是 GNU 組織開發和推廣的一個項目。
Bash腳本類似批處理,簡單來講就是把許多的指令集合在一起,並提供循環、
條件、判斷等重要功能,語法簡單實用,用以編寫程序,大大簡化管理員的操
作,並可以完成圖形工具所無法實現的功能。
1. 創建包含bash命令的文本文件。文件的第一行應爲:
#!/bin/bash
2. 使文件可執行(使用chmod +x scripts)
3. 將文件放置在用戶的$PATH的目錄中
~/bin – 用於用戶的私有程序
/usr/local/bin – 本地開發、系統上的其他人使用的腳本
/usr/local/sbin - 本地開發、由root使用的腳本
直接運行腳本和使用source命令運行腳本是不同的!
腳本調試模式:
#!/bin/bash -x
# bash -x scripts
##1. 引用和轉義
引用和轉義在shell解析字符串時用於去除字符串中特殊字符或保留詞語的特殊含義。這會導致按字面處理字符串,而不是展開變量或將其部分內容視作具有特殊含義。
引用有三種類型:
弱引用
將字符串放置在雙引號中,保留字符串中所有字符的文字值,$、`、\和!字符除外。換言之,變量
擴展和命令擴展在雙引號內仍起作用。
echo “can I have a $FRUIT”
echo “The current time is $(date +%r).”
強引用
將字符串放置在單引號中,保留字符串中所有字符的文字值,同時禁用所有擴展:
echo “Make $$$ Fast”
rm 'untitled folder'
轉義
非引用的\是轉義字符。它保留了下一個字符的文字值。(例如,\$PATH是確切的字符串$PATH,而
不是PATH變量的內容。)
echo Make \$\$\$ Fast\!
ls untitled\ folder
例:
##2. Shell變量
shell變量用於爲稍後在腳本中使用的名稱指定值,並且僅限於shell命令行或從中聲明變
量的腳本。
例:
##3. 算術運算符:
算術運算符指的是可以在程序中實現加、減、乘、除等數學運算的運算符。
##4. 循環
for循環用於值列表中的相同命令的重複。
循環與計算結合:
##5. 退出狀態
Linux命令完成時,將返回退出狀態。成功完成程序時,將返回0的推出狀態。這被bash
當作邏輯True值。非零退出狀態通常表示發生了錯誤,並且被bash當作邏輯False值。
例如:grep的退出狀態的含義:
0 – 在指定的文件中找到了模式
1 – 在指定的文件中未找到模式
>1 – 一些其他錯誤(無法打開文件、錯誤的搜索表達式等)
推出狀態的值被存儲在"?"中,可以使用以下命令查看:
# echo $?
##6. test條件判斷
test命令可用於評估bash腳本中的表達式。它評估其參數所指定的表達式,如果表達式
爲true,返回零退出狀態,如果表達式爲false,則返回非零退出狀態。test具有替代語
法,使用方括號"[]"將表達式括起來,這樣更易於閱讀。
字符串比較運算符:=、!=
例:
數字比較運算符:-eq、-ne、-lt、-le、-gt、-ge
例:
##7. case語句
case語句 :它能夠把變量的內容與多個模板進行匹配,再根據成功匹配的模板去決定應該執行哪
部分代碼。
例:
[root@web100 ~]# vim fruit.sh
##8. if語句
if命令檢查if後面的命令或列表的退出值。如果第一個命令評估爲true/零,則運行then
之後的命令列表,直至任一else。如果第一個命令評估爲false/非零,則運行else與fi之
間的命令列表(反向平寫if,標記if塊的結束)。
例:
製作一個查看文件狀態的腳本:
[root@web100 ~]# vim file.sh
##9. expect語句
在shell中利用expect實現自動應答腳本。
#!/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開始,分別表示第一個,第二個,第三個....參數。
例:
[root@web100 ~]# yum install expect -y
[root@web100 ~]# vim answer.exp
[root@web100 ~]# chmod +x answer.exp
[root@web100 ~]# answer.exp tom 30 java bad
##.10 環境變量
shell和腳本使用變量來存儲數據 ,有些變量可以連同它們的內容傳遞給子進程,這些
變量我們稱之爲環境變量。
使用env命令顯示所有環境變量
使用set命令現實所有本地定義的shell變量
Bash啓動腳本
在用戶登錄的時候,會運行全局變量文件/etc/profile,和用戶自定義變量文件
~/.bash_profile去初始化它們的環境變量。
##11. 使用別名
alias命令可以用來自定義屬於自己的系統命令,寫入~/.bashrc 文件永久生效。
查看別名:
設置別名:
[root@web100 ~]# alias host='hostname'
[root@web100 ~]# host
web100.westos.com
刪除別名:
[root@web100 ~]# unalias host
製作一個倒計時10s的計數器的腳本:
[root@web100 ~]# vim 1.time.sh
製作一個倒計時1分10s的計數器的腳本:
[root@web100 ~]# vim 2.time.sh
製作一個檢查前10臺主機能否ping通的腳本:
[root@web100 ~]# vim ping.sh
製作一個檢查任意主機能否ping通的腳本:
[root@web100 ~]# vim ping*.sh
製作一個備份數據庫的腳本:
[root@web100 ~]# vim mysql.sh
製作一個判斷輸入數值是否在區間範圍內的腳本:
[root@web100 ~]# vim 1-10.sh
製作一個批量創建用戶的腳本:
[root@web100 ~]# vim useradd.sh