鳥哥的Linux私房菜基礎篇 第十三章 shell scripts

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 練習

  1. 對話式:
#!/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}" # 結果由屏幕輸出
  1. 日期命名文件:
    日期的格式化輸出: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}"
  1. 數值運算:
    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執行方式的區別

  1. source script
  2. sh script
  3. ./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 內容顯示到屏幕上,這是很有用的參數!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章