一. shell腳本基礎
Bash腳本相似批處理,簡單來說就是把許多的指令集合在一塊兒,並提供循環、
條件、判斷等重要功能,語法簡單實用,用以編寫程序,大大簡化管理員的操
做,並能夠完成圖形工具所沒法實現的功能。
1. 建立包含bash命令的文本文件。文件的第一行應爲:
#!/bin/bash
#!/usr/bin/env tcsh 【這樣寫不用尋找指定bash目錄,在env中自動搜索執行】
2. 使文件可執行(使用chmod +x scripts;sh ~.sh)
3. 將文件放置在用戶的$PATH的目錄中
~/bin – 用於用戶的私有程序
/usr/local/bin – 本地開發、系統上的其餘人使用的腳本
/usr/local/sbin - 本地開發、由root使用的腳本
直接運行腳本和使用source命令運行腳本是不一樣的!
腳本調試模式:
#!/bin/bash -x
# bash -x scripts
二. 基礎命令
1. 引用(強度有高到底)
' '
" "
2.轉義
\
3.執行命令
` `
4.變量
name=HXL
echo $name
5.命令替換
Time=`dade`
Weather=is sun
echo $Time$Weather
6.算術運算符(與c語言差很少)
<變量>++
<變量>--
-
+
**
*
/
%
+=
-+
7.計算命令
echo $[1+2]
echo `expr 1 + 2` (加號與數必須空一個,要否則就當作一個總體了)
let A=1+2 echo $A
用(())表示數學運算。bash內建功能,效率高。(腳本中使用)
test -{b|c|e|f|d|r|w|x|s|L} file/directory
[ -b /dev/sda ];echo $? 【判斷文件是否爲一個block device】
1
[ -c /dev/sda ];echo $? 【判斷文件是否存在且是一個character device】
0
[ -e /dev/sda ];echo $? 【判斷文件是否存在,經常使用】
0
[ -f /dev/sda ];echo $? 【判斷文件是否存在且爲文件(file),經常使用】
0
[ -d /dev/sda ];echo $? 【判斷文件是否存在且爲目錄(directory),經常使用】
1
[ -L /dev/sda ];echo $? 【判斷文件是否存在且爲一個連接文件】
1
node
test -{zn} string
test -z string 【判斷字符串是否爲0?若string爲空字符串,則爲true】
test -n string 【判斷判斷字符串是否非爲0?若string爲空字符串,則爲false】
mysql
二. 進制文件運算符:-ef,-nt,-ot
[ /bin/mount -ef /usr/bin/mount ];echo $? 【判斷兩個文件是否爲同一個文件,可用在判斷hard link的斷定上。主要意義是斷定兩個文件是否指向同一個inode】
0
[ /bin/mount -nt /usr/bin/mount ];echo $? 【判斷/bin/mount 是否比 /usr/bin/mount 新】
1
[ /bin/mount -ot /usr/bin/mount ];echo $? 【判斷/bin/mount 是否比 /usr/bin/mount 舊】
1
邏輯運算符:-o,-a,!,&&,||
[ 2 -gt 1 -a 1 -gt 2 ];echo $? (2>1and 1>2,錯誤)
1
[ 2 -gt 1 -o 1 -gt 2 ];echo $? (2>1 or1>2,正確)
0
[ !2 -gt 1];echo $? (非2>1,錯誤)
1
三. 【語句】
for語句
for HOST in HXL{1..3};do echo $HOST;done
HXL1
HXL2
HXL3
vim /etc/2.sh
#!/usr/bin/env tcsh
for ((i=1;i<=10;i++))
do
((j+=i))
#j=`expr $j + $i` [這三種方法均可以]
#let j+=i
#j=$[j+=i]
#declare -i j+=i
done
echo $j
【數據庫備份小腳本】
vim MsqDump.sh
#!/bin/bash
for x in $(mysql -uroot -phxl -e "show databases;" -NE | grep -E "^\*|schema$"-v)
do
mysqldump -uroot -phxl $x >/mnt/$x.dump
done
(-NE 是爲了讓數據庫表信息呈現橫向數據排序,而不是表格形式)
if語句
語法:if command;then command1;command2;elsecommand3;fi
例子
#!/usr/bin/env tcsh
if [ "$USER" !="root" ];then 【這裏只能用 !=,不能用 -nq】,=,!=,...表示字符型,而-eq,-nq..表示整型
echo "I'm notroot"
else
echo "I'm root"
fi
case語句:它可以把變量的內容與多個模板進行匹配,再根據成功匹配的模板去決定應該執行那部分代碼
#!/bin/bash
case "$1" in
banana)
echo apple
;;
apple)
echo banana
;;
*)
echo shab
;;
esac
【*expect】實現自動應答腳本
vim /SHELL/talk
#!/bin/bash
echo "who are you?"
read who
echo "hello,$who"
echo "Are you happy?"
read answer
echo "why?"
read answer
vim /SHELL/auto.exp
#!/usr/bin/expect
#set timeout 3 【設置後面全部的expect命令的等待響應的超時時間,單位爲妙】
spawn /SHELL/talk.sh 【spawn是expect的內部命令,做用是給後面的shell指令加個接入源,傳遞交互指令】
expect "who are you" 【判斷接入源中是否有該匹配的字段,若是有則當即返回,不然等待超時時間後返回】
send "Hxl\n" 【執行交互動做,至關於手工輸入「HXL」】
expect "Are you happy"
send "Yes,I am happy.\n"
expect "why?"
send "You ah me!\n"
expect eof 【做用是在輸入中搜索文件結束符,若是沒有這一行,腳本會當即退出,得不到正確結果】
exit
interact 【執行完成後保持交互狀態,把控制權交給控制檯,這時候就能夠手工操做,不然退出登錄】
四. $argv 參數數組
expect腳本能夠接受從bash傳遞過來的參數.可使用[lindex $argv n]得到,n從0開始,分別表示第
一個,第二個,第三個....參數。
例子,一次執行 ssh root@172.25.254.[1..10] redhathostname
vim /SHELL/HNmame.sh
NUM=160
ping -c1 -w1 172.25.254.$NUM &> /dev/null && /BASH/ssh.exp172.25.254.$NUM redhat hostname
vim /SHELL/ssh.exp
#!/usr/bin/expect
set IP [ lindex $argv 0 ]
set PASS [ lindex $argv 1 ]
set COMM [ lindex $argv 2 ]
spawn ssh root@$IP $COMM
expect {
"yes/no"
{send"yes\r";exp_continue} [這是一個選擇回答的格式,若是檢索到「yes/no」,則回答 yes,沒檢索到則繼續下面的檢索]
"password"
{send "$PASS\r"}
}
interact
5.環境變量
在當前bash中再開啓一個新bash,通常來講須要對已經定義的變量從新賦值。若不想從新賦值,則須要把原來的變量加入到環境變量中,由於:子程序僅會繼承夫進程的環境變量,而不會繼承夫進程的自定義變量
例如
name=HXL
export name [將name加入到環境變量]
bash [開啓新bash]
echo $name
HXL
加入到環境變量中的方法:1.export 變量名;2.declare -x 變量名
declare [-aixr] 變量名
declare -a 變量名 【將變量定義成爲數組(array)類型】
declare -i 變量名 【將變量定義成爲×××(interger)類型】
declare -i num=1+2+3 [不加declare-i,echo $num 仍是 1+2+3]
echo $num
declare -x 變量名
declare -r 變量名 【將變量設置爲readonly類型,該變量不可被更改內容,也不能重設】
declare -p 變量名 【查看變量被設置爲以上那種屬性】
declare -p num
declare -i num="6"
6.設置別名 alias和unalias
例子(有空格必須加'')
alias c='clear' 【將c指定爲clear 命令】
【注意】若命令相同,別名優先;若不想每次都更改,能夠寫道用戶私有目錄下的.bashrc 文件中
sql