【Bash Scripts】

一. 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

相關文章
相關標籤/搜索