脚 本
1.創(chuàng)建腳本
? ?#!/bin/bash ?##腳本第一行,用/bin/bash執(zhí)行
? ?echo "hello world" ? ##執(zhí)行的命令
? ?
? ? * /usr/local/bin ?本地開發(fā)、系統(tǒng)上的其他人使用的腳本
? ? * /usr/local/sbin ?本地開發(fā)、由root使用的腳本
? ?2.腳本的執(zhí)行和調試
? ?3.引用和轉義
? ? * ?在shell解析字符串時用于去除字符串中特殊字符或保留詞語的特殊含義。這會導致 按字面處理字符串,而不是展開變量或將其部分內容視作具有特殊含義。
? ?
? echo "can i have a $FRUIT"
?* ?弱引用,將字符串放置在雙引號中,保留字符串中所有字符的文字值,$、`、\和!字符除外。換言之,變量擴展和命令擴展在雙引號內仍起作用。
? echo 'can i have a $FRUIT'
?* ?強引用,將字符串放置在單引號中,保留字符串中所有字符的文字值,同時禁用所有擴展
? * ?轉義,非引用的\是轉義字符。它保留了下一個字符的文字值。
? ?4.shell變量
? ? * ?用于為稍后在腳本中使用的名稱指定值,并且僅限于shell命令行或從中聲明變量的腳本
? ?FITST=jhon ?##定義變量
? ?echo ${FIRST}_$LAST ? ##使用變量
??
? ? 5.命令替換
? ? * ?在子shell中執(zhí)行指定命令并用命令輸出替換腳本中的命令替換。
? ? 6.算術運算符
? ? * ?可以在程序中實現(xiàn)加、減、乘、除等數(shù)學運算的運算符。
? ?- ? ? 減法
? ?+ ? ? 加法
? ?** ? ?冪運算
? ?* ? ? 乘法
? ?/ ? ? 除法
? ?% ? ? 余數(shù)
? ?i++ ? ?增量后
? ?i-- ? ?減量后
? ?+= ? ? 加等
? ?-= ? ? 減等
? ## 腳本內容表示從1到10之和
? ?運行結果
?
?
? ? 7.for循環(huán)
? ? * ?用于值列表中的相同命令的重復。
? ? ## ?(seq 2 2 8)表示從2到8隔兩個數(shù)取數(shù)
??
? ? 8.循環(huán)與計算結合
? ** 表示從1加到99的總和
? 結果
? ?9.數(shù)據(jù)庫備份示例
??
? ?#!/bin/bash
? ?for DB in $(mysql -uroot -p123 -e "show databases;" -E -N | grep -v '^*' | grep -v ? ?'schema$') ? ?//過濾要備份的數(shù)據(jù)庫
? ?do
? ?echo "Backup $DB" ? ? //顯示Backup 庫名
? ?mysqldump $DB > /dbbackup/$DB.dump ? ?//備份數(shù)據(jù)庫到dbbackup目錄
? ?done
? ?echo "OK" ? ? ?//備份完成后顯示OK
? ?for DBDUMP in /dbbackup/* ? ?//從dbbackup目錄中過濾庫名
? ?do
? ?SIZE=$(stat --printf "%s\n" $DBDUMP) ? //統(tǒng)計備份文件大小
? ?echo "$DBDUMP?$SIZE" ? //顯示庫名和大小
? ?done
? ?10.位置參數(shù)
? *?使用read提示用戶輸入(使用-p選項)并將其直接存儲到一個或多個變量,為交互式輸入
? ?測試
??*?使用位置參數(shù)來讀取傳遞給腳本的命令行參數(shù)或選項輸入。各種特殊變量存儲傳遞的選項編號。
? ? 指定的位置參數(shù)總數(shù):$#
? ? 位置參數(shù)自身:$0、$1、$2、$3....
? ? 所有位置參數(shù): $@、$*
? ?測試
?
?? 11.退出狀態(tài)
? ??* ?Linux命令完成時,將返回退出狀態(tài)。成功完成程序時,將返回0的推出狀態(tài)。這被bash當作邏輯True值。非零退出狀態(tài)通常表示發(fā)生了錯誤,并且被bash當作邏輯False值。
? ?echo $? ?##退出狀態(tài)的值被存儲在"?"中,查看退出狀態(tài)
? ?* ?退出狀態(tài)數(shù)字的含義
? ?0 ? ?##在指定的文件中找到了模式
? ?1 ? ?##在指定的文件中未找到模式
? ?>1 ? ?##一些其他錯誤(無法打開文件、錯誤的搜索表達式等)
?
? ?12.test條件判斷
? ?* ?test命令可用于評估bash腳本中的表達式。它評估其參數(shù)所指定的表達式,如果表達式為true,返回零退出狀態(tài),如果表達式為false,則返回非零退出狀態(tài)。test具有替代語法,使用方括號"[]"將表達式括起來,這樣更易于閱讀。
? ?* ?非零或零長度字符串運算符
? ? [ -n westos];echo $? ? ##判斷不是非零字符,也可寫為test -n westos;echo $?
???[ -z westos];echo $? ? ##判斷是非零字符
??
? ?* ?字符串比較運算符
? ?= ? ?##等于字符
? != ? ?##不等于字符
? ?* ?數(shù)字比較運算符
??-eq ? ?等于
? ?-ne ? ? ? ? ? 不等于
? ?-lt? ? 小于
? ?-le ? 小于等于
? ?-gt ? ? ? ? ?大于
? ?-ge ? ? ? ? 大于大于
? ? ?
? ?* ?文件狀態(tài)運算符
? ?測試
? ? -b ? ?##塊設備文件
? ? -c ? ?##字符設備文件
? ? -e ? ?##文件是否存在
? ? -f ? ?##是否是常規(guī)文件
? ? -d ? ?##是否是目錄
? ? -S ? ?##套接字文件
? ? -L ? ?##是否是鏈接
? ? * ?二進制文件運算符
? ?
? ? -ef ? ?##兩文件是否相同
? ? -nt ? ?##第一個文件是否比第二個新
? ? -ot ? ?##第一個文件是否比第二個舊
? ? * ?邏輯運算符
? ? -a ? ?##并且,兩個條件同時滿足
? ? -o ? ?##或者,兩個條件最少滿足任意一個
? ? ! ? ?##給結果取反
? ? ?&& ? ?##結果正確執(zhí)行
? ? ?|| ? ?##結果不正確執(zhí)行
? ??
? ? 13.if語句
? ?* ?if命令檢查if后面的命令或列表的退出值。如果第一個命令評估為true/零,則運行then之后的命令列表,直至任一else。如果第一個命令評估為false/非零,則運行else與fi之間的命令列表(反向平寫if,標記if塊的結束)。
#!/bin/bash
if
????????[ -z "$1" ] ? ? //腳本后沒跟文件
then
????????echo please give me file ? //顯示please give me file
elif
????????[ ! -e "$1" ] ? ? ? //如果腳本后跟的文件不存在 ? ?
then
????????echo "$1 is not exist" ? ?//顯示文件is not exist
else
????????for NAME in `cat $1` ? ? ? //從文件中過濾NAME
????????do
?????????????USER=`getent passwd $NAME` ? //檢測用戶是否存在
?????????????if
?????????????[ -z "$USER" ] ? ? //如果用戶不存在
?????????????then
???????????????????useradd $NAME ? ?//添加用戶
???????????????????echo wsetos | passwd --stdin $NAME ? //并設置密碼
?????????????else
???????????????????echo $NAME is exist ? ? ?//顯示用戶存在
?????????????fi
?????????done
fi ? ? ?//結束
? ? ?* ?測試
? ? 14.case語句
? ?* ?它能夠把變量的內容與多個模板進行匹配,再根據(jù)成功匹配的模板去決定應該執(zhí)行哪部分代碼。esac標記結束
#!/bin/bash
case "$2" in
?????+) ? ?//第二個變量為+
??????echo num=$[ $1 + $3 ] ? //輸出$1 + $3的值
?????;;
?????-) ? ?//第二個變量為-
??????echo num=$[ $1 - $3 ] ? //輸出$1 - $3的值
??????;;
?????%) ? ?//第二個變量為%
??????echo num=$[ $1 * $3 ] ? //輸出$1 % $3的值
??????;;
??????/) ? //第二個變量為/
??????echo num=$[ $1 / $3 ] ? //輸出$1 / $3的值
??????;;
?????*) ? ? //第二個變量為其他
??????echo ??"please input right command" ? //輸出please input right command
??????;;
esac
? ?* ?測試
? ? 15.expect語句
? ?* ?實現(xiàn)自動應答腳本。
? ?交互輸入腳本
??
??? ## 使用expect腳本之前要yum install expect -y
? ?
? ? expect腳本
? ?#!/user/bin/expect ? ?//告訴操作系統(tǒng)腳本里的代碼使用那一個shell來執(zhí)行。
? ?set timeout 10 ? ? ? //設置后面所有的expect命令的等待響應的超時時間,單位為秒
? ?spawn /mnt/ask.sh??//spawn是expect的內部命令,作用是給后面的shell指令加個殼,用來傳遞交互指令。
? ?expect "who" ? ?//判斷上次輸出結果里是否包含“who”的字符串,如果有則立即返回,否則等待超時時間后返回。
? ?send "haha\r" ? //執(zhí)行交互動作,相當于手工輸入"westos"。
? ?expect "old" ??
? ?send "13\r"
? ?expect "happy"
? ?send "happy\r"
? ?expect eof ? ?//作用是在輸出中搜索文件結束符,如果沒有這一行,腳本會立即退出,得不到正確結果。
? ?##?interact表示執(zhí)行完成后保持交互狀態(tài),把控制權交給控制臺,這個時候就可以手工操作了。否則退出登錄。
? * ?測試
? ?16.環(huán)境變量
? ?* ?shell和腳本使用變量來存儲數(shù)據(jù) ,有些變量可以連同它們的內容傳遞給子進程,這些變量我們稱之為環(huán)境變量,分為三種
? ?(1) 臨時設置,換了shell后不存在
? ?(2) 用戶級別設置,相對應的用戶一直生效,切換用戶后不生效
? ? ?修改~./bash_profile文件
? ? ?* 測試
? ?(3)系統(tǒng)級別修改,切換用戶后也會生效
? ? ?修改/etc/profile文件
? ? * 測試
? ?(4) env ?##查看環(huán)境變量
? ?17.別名
? ? * ?自定義屬于自己的系統(tǒng)命令。
? ?(1) 臨時生效
? ?alias xie = 'vim' ? ##臨時設置別名
? ?alias ? ? ##查看別名
? ?(2) ?永久生效
? ? 修改~./ bashrc文件
? ?* 測試
? ? source ?./ bashrc ?##文件生效
? ? (3) 刪除別名
? ? ?unalias ?xie ?
? ?18.函數(shù)
#!/bin/bash
ACTION () { ? ? //設置函數(shù)
if [ $2 $1 ];then ? //判斷條件
? ?echo "$1 is $3" ?
fi
}
? ?ACTION $1 ?"! -e" ‘not exist’ ?//使用函數(shù)
? ?ACTION $1 ?"-b" ‘not exist’
? ?ACTION $1 ?"-f" ‘not exist’
? ?ACTION $1 ?"-L" ‘not exist’
? ?ACTION $1 ?"-d" ‘not exist’
? ?ACTION $1 ?"-c" ‘not exist’
? ?ACTION $1 ?"-s" ‘not exist’
本文轉自 漂浮的天堂? 51CTO博客,原文鏈接:http://blog.51cto.com/12774215/1941448,如需轉載請自行聯(lián)系原作者
總結
- 上一篇: 知识的深度跟知识的广度
- 下一篇: LintCode: Hash Funct