腳本
使用一種特定的描述性語言,依據一定的格式編寫的可執行文件,又稱作宏或批處理文件。
創建新shell腳本
開頭
創建包含bash命令的文本文件。文件的第一行應爲:
#!/bin/bash
權限
文件書寫完成後,使文件可執行- 賦予可執行的權限 chmod +x
- 直接指定交互執行方式 sh/bash
路徑自動檢測
將文件放置在用戶的$PATH的目錄中
- ~/bin ##用於用戶的私有程序
- /usr/local/bin ##本地開發、系統上的其他人使用的腳本
- /usr/local/sbin ##本地開發、由root使用的腳本
腳本調試模式
修改文本
#!/bin/bash -x
終端查看
bash -x scripts
引用和轉義
引用和轉義在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
例子:
運行:
Shell變量
shell變量用於爲稍後在腳本中使用的名稱指定值,並且僅限於shell命令行或從中聲明變量的腳本。
- 變量的使用
若要定義或指定值:
FRUIT=apple
若要參考或使用變量:
$FRUIT
${FRUIT} ##兩者同意思,第二個後面可以緊接着字符
- 常用shell默認變量:
$0 =>shell名稱
$1 =>腳本參數的第一個參數
$? =>上一個命令執行的返回碼(或者叫返回狀態),0爲正常,其他爲有錯
$# =>傳遞到腳本的的參數的總個數
$*/$@ =>表示所有的命令參數
“$*”=>將所有的參數當作一行字符串
“$@”=>將但各參數視爲一個單獨字符串
$$ =>當前shell進程編號
$HOME =>登陸目錄
$PWD =>當前工作目錄
注:返回狀態的分類:
算術運算
$ [ 數1 運算符 數2 ] ##注意在括號兩邊 要有空格進行隔開或者直接是兩對括號(())
注意:單一個等號表示賦值,也可以在前面添加let 來進行附值。
例子:倒計時10秒:
語句
for循環語法
for
Xx in xxx
Xx in $( seq 起始位置 步長 結束位置)
do
done
for循環語法
while xx
do
xxx
done
例子:倒計時兩分鐘10秒:
if條件判斷語句
if xx
then
xxx
elif xxxx
then
xxxxx
else
xxxxxx
fi
case條件分支語句
例子:數據庫自動備份:
#!/bin/bash
dir=/backupdb
if [ -d $dir ];then
echo "目錄已經存在"
else
mkdir $dir
echo "$dir 目錄創建成功"
fi
# [ -d $dir] || mkdir $dir
for DB in $(mysql -e "show databases;" -E -N | grep -v '^*' | grep -v 'schema$')
do
echo "backing up $DB..."
dbname=${DB}_$(date +%Y-%m-%d)
mysqldump $DB > $dir/$dbname
size=$(stat --print "%s\n" $dir/$dbname)
echo "$dbname $size"
done
Test的用法
Test 命令有兩種表示方式:
第一種:test 後面直接加參數進行運用
第二種:用 [ ] 表示test 進行運用
常用參數選項:
expect語句
用於自動回答安裝過程的交互問答.
安裝expect:
例子:自動回答建立分區:
第一種,單文件expect:
#!/usr/bin/expect
spawn fdisk /dev/vdb ##執行的主要命令
expect "Command (m for help)" ##預期問題的預期關鍵字
send "n\r" ##發送回答
expect "Select (default p):"
send "p\r"
expect "Partition number "
send "1\r"
expect "First sector"
send "\r"
expect "Last sector, +sectors or +size{K,M,G"
send "+512M\r"
expect "Command (m for help)"
send "wq\r"
expect eof
第二種,嵌入expect:
all