1 shell scripts 概念
望文生義:針對shell 寫成的腳本,或者叫劇本。
簡單的說,shell scripts就是早期DOS年代的批處理文件(.dat).
作用:
- 自動化管理
- 追蹤與管理系統的重要工作
- 簡單入侵偵測功能
- 連續指令單一化
- 簡單的數據處理
- 跨平臺支持與學習歷程短
例子:
#!/bin/bash
# Program:
# This program shows "Hello World!" in your screen.
# History:
# 2015/07/16 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello World! \a \n"
exit 0
2 練習
- 對話式:
#!/bin/bash
# Program:
# User inputs his first name and last name. Program shows his full name.
# History:
# 2015/07/16 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input your first name: " firstname # 提示使用者輸入
read -p "Please input your last name: " lastname # 提示使用者輸入
echo -e "\nYour full name is: ${firstname} ${lastname}" # 結果由屏幕輸出
- 日期命名文件:
日期的格式化輸出:date +%Y%m%d
#!/bin/bash
# Program:
# Program creates three files, which named by user's input and date command.
# History:
# 2015/07/16 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 1 讓使用者輸入文件名稱,並取得 fileuser 這個變量;
echo -e "I will use 'touch' command to create 3 files." # 純粹顯示信息
read -p "Please input your filename: " fileuser # 提示使用者輸入
# 2 爲了避免使用者隨意按 Enter ,利用[變量功能](../Text/index.html#variable_other_re)分析文件名是否有設置?
filename=${fileuser:-"filename"} # 開始判斷有否配置文件名
# 3 開始利用 date 指令來取得所需要的文件名了;
date1=$(date --date='2 days ago' +%Y%m%d) # 前兩天的日期
date2=$(date --date='1 days ago' +%Y%m%d) # 前一天的日期
date3=$(date +%Y%m%d) # 今天的日期
file1=${filename}${date1} # 下面三行在配置文件名
file2=${filename}${date2}
file3=${filename}${date3}
# 4 將文件名創建吧!
touch "${file1}" # 下面三行在創建文件
touch "${file2}"
touch "${file3}"
- 數值運算:
declare 可以聲明爲變量
使用$(())也可以表明是變量
sum=1+2+3
echo $sum
declare -i sum=1+2+3
echo $sum
read -p "second num" sed
total=$(($sum+$sed))
echo $total
計算PI的程序。爲了確認VM的效率實驗,保持計算機的忙碌狀態,可以使用這個程序運行。
3 script執行方式的區別
- source script
- sh script
- ./script
- 直接執行script,sh(bash) script或者絕地相對路徑
是重新開一個新的bash環境來進行的。 - 利用source來進行執行
是子啊父進程執行
4 判斷式
test指令
test -e /tmp && echo "exist" || echo "not exist"
test ${HOME} == ${MAIL}
[ ] 判斷符號
[ "$HOME" == "$MAIL" ] #一個=與兩個==等價
#在中括號中每個元素都需要空白格
#變量需要用“”
#常熟需要用單或雙引號
#!/bin/bash
read -p "Please input (Y/N): " yn
[ "${yn}" == "Y" -o "${yn}" == "y" ] && echo "OK, continue" && exit 0
[ "${yn}" == "N" -o "${yn}" == "n" ] && echo "Oh, interrupt!" && exit 0
echo "I don't know what your choice is" && exit 0
$0,$1等默認變量
/path/to/scriptname opt1 opt2 opt3 opt4
$0 $1 $2 $3 $4
$#: 代表後面的參數個數
$@: 代表"$1" “$2” “$3” “$4” ,每個變量獨立。
$*: 代表" $1 $2 $3 $3 "
shift:造成參數變量號碼偏移
echo "your whole parameter is $@"
shift 1
ehco "your whole parameter is $@"
5 條件判斷式
單層,基本條件判斷結構
if []; then
...
fi
多層結構
if [];then
elif [] ;then
else
fi
利用function功能
function fname() {
…
}
由於shell script的執行是由上而下,由左至右,因此在 shell script 當中的
function 的設置一定要在程序的最前面。
function 擁有內置變量,它的內置變量,$0,$1… 此處與shell script的不同。
6 循環(loop)
不定循環
while do done, until do done
固定循環
for var in con1 con2…
do
…
done
eg1:
for var in con1 con2 con3 ...
do
程序段
done
eg2:
users=$(cut -d ':' -f1 /etc/passwd) # 擷取帳號名稱
for username in ${users} # 開始循環進行!
do
id ${username}
done
eg3:
for i in $(seq 1 100) # for i in {1..100}
do
echo -ne $i #不自動換行
done
for…do…done的數值處理
for ((初始值;限制值;執行步長))
do
..
done
eg:
s=0
for ((i=1;i<=10;i=i+1))
do
s=$(($s+$i))
done
echo $s
7 shell script的追蹤與調試
[dmtsai@study ~]$ sh [-nvx] scripts.sh
選項與參數:
-n :不要執行 script,僅查詢語法的問題;
-v :再執行 sccript 前,先將 scripts 的內容輸出到屏幕上;
-x :將使用到的 script 內容顯示到屏幕上,這是很有用的參數!