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

u201017971發表於2018-11-28

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 內容顯示到螢幕上,這是很有用的引數!

相關文章