bash腳本編程
腳本文件格式:
第一行,頂格:#!/bin/bash
注釋信息:#
代碼注釋:
縮進,適度添加空白行;
語言:編程語法格式,庫,算法和數據結構
編程思想:
問題空間–解空間
變量:
局部變量
本地變量
環境變量
位置參數變量
特殊變量
數據類型:字符、數值型
弱類型:字符型
算術運算:
+ ,-, *, /,**
VAR= let VAR=$num1 op $num2
VAR= $[expression]
VAR=$((expression))
VAR=$(expr argu1 argu2 argu3)
注意:有些時候乘法符號需要轉義;
增強型賦值:
變量做某種算術運算后回存至此變量中;
let i=$i+#
let i+=#
+=, -=, *=, %=
自增:
let VAR=$[$VAR+1]
let VAR+=1
let VAR++
自減:
VAR=$[VAR-1]
let VAR=1
let VAR–
練習:寫一個腳本
1 計數/etc/passwd文件中的第10個用戶和第20個用戶的id號之和;
id1=$(head-10/etc/passwd | tail-1 | cut -d: -f3)
id1=$(head-20/etc/passwd | tail-1 | cut -d: -f3)
2、計算/etc/rc.d/init/d/functions和/etc/inittab文件的空白行數之和;
grep "^[[:space:]]*$" /etc/rc.d/init.d/functions | wc -l
條件測試:
判斷某需求是否滿足,需要由測試機制來實現;
如何編寫測試表達式以實現所需的測試:
(1)執行命令,并利用命令狀態返回值來判斷;
0:成功
1-255:失敗
(2)測試表達式
test EXPRESSION
[EXPRESSION]
[ [EXPRESSION]]
注意:EXPRESSION兩端必須有空白字符,否則為語法錯誤;
bash的測試類型:
數值測試
字符串測試
文件測試
數值測試:數值比較
-eq: 是否等于: [$num1 -eq $num2]
-ne: 是否不等于;
-gt:是否大于等于;
-lt: 是否小于;
-le: 是否小于等于;
字符串測試:
==:是否等于;
>:是否大于;
<:是否小于;
!=:是否不等于;
=-: 左側的字符串是否能夠被右側的PATTERN所匹配;
-z: "STRING":判斷指定的字串是否為空;空位真,不空為假;
-n: "STRING":判斷指定的字串是否為不空,不空為真,空則假;
注意:(1)字符串要加引號;
(2)要使用[[]];
文件測試:
存在性測試
-a FILE
-e FILE
文件的存在性測試,存在則為真,否則則為假;
存在性及類型測試
-b FILE: 是否存在并且為塊設備文件;
-c:FILE :是否存在并且為目錄文件;
-f: FILE 是否存在并且為普通文件;
-h: FILE 或 -L FILE: 是否存在并且為符號鏈接文件;
-p: FILE: 是否存在且為命名管道文件;
-s: FILE: 是否存在且為套接字文件;
文件權限測試:
-r FILE:是否存在并且對當前用戶可讀;
-w FILE:是否存在并且對當前用戶可寫;
-x FILE:是否存在并且對當前用戶可執行;
特殊權限測試:
-u: FILE: 是否存在并且擁有suld權限;
-g: FILE 是否存在并且對當前用戶可讀;
-k FILE: 是否存在并且 擁有sticky 權限
;
文件是否有內容:
-s FILE: 是否有內容;
時間戳:
-N FILE: 文件自從上一次讀操作后是否被修改過;
從屬關系測試:
-O FILE:當前用戶是否為文件的屬主;
-G FILE: 當前用戶是否屬于文件的屬組;
雙目測試:
FILE1 -ef FILE2: FILE1與FILE2是否指向同一個文件系統相同inode的硬連接;
FILE1 -nt FILE2:FILE1是否新于FILE2;
FILE1 -ot FILE2: FILE1是否舊于FILE2;
組合測試條件:
邏輯運算:
第一種方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
[ -O FILE ] && [ -r FILE ]
第二種方式:
EXPRESSION1 -a EXPPRESSION2
! EXPRESSION
[ -O FILE -a -x FILE ]
練習:將當前主機名稱保存至hostName變量中;
主機名如果為空,或者為localhost.localdomain,則將其設置為www.magedu.com;
hostName=&(hostname)
[ [ -z "$hostName" -o "$hostName"=="locahost.localdomain" -o "$hostName" == "localhost"]] && hostname www.magedu.com
腳本狀態返回值:
默認是腳本中執行的最后一天命令的狀態返回值;
自定義狀態退出狀態碼:
exit [n]: n為自己指定的狀態碼;
注意:shell進程遇到exit時,即會終止,因此,整個腳本執行即 為結束;
向腳本傳遞參數:
位置參數變量
myscript.sh argu1 argu2
引用方式:
$1, $2,…,${10},${11},…
輪替:
shift [n]: 位置參數輪替;
練習;寫一腳本,通過命令傳遞兩個文本文件路徑給腳本,計算器空白行數之和;
#!/bin/bash
#
file1-lines=$(grep "^$" $1 | wc -l)
file2-lines=$(grep "^$" $2 | wc -l)
echo "Total blank lines: $[$file1-lines+$file2-lines]"
特殊變量:
$0 :腳本文件路徑的本身;
$#:腳本參數的個數;
$*: 所有參數;“hello" "hi" "toyou"
$@: 所有參數;"hello hi toyou"
過程式編程語言的代碼執行順序;
順序執行:逐條運行;
選擇執行:代碼有一個分支:條件滿足是才會執行;
兩個或以上是分支:只會執行其中一個滿足條件的分支;
循環執行:
代碼片段(循環體)要執行0、1或多個來回;
選擇執行:
if 測試條件
then
代碼分支
fi
雙分支的if語句;
if 測試條件;then
條件為真實執行的分支
else
fi
示例:通過參數傳遞一個用戶給腳本,次用戶不存在是,則添加之;
#!/bin/bash
#
if !|grep "^$1\“ /etc/passwd/ $> /dev/null; then
useradd $1
echo $1 | passwd –stdin $1 $> /dev/null
echo "Add user $1 finished."
fi
做條件判斷:
#!/bin/bash
#
if [ $# -lt 1 ]; then
echo "At least one username."
exit 2
fi
if !|grep "^$1\“ /etc/passwd/ $> /dev/null; then
echo "User $1 exists."
else
useradd $1
echo $1 | passwd –stdin $1 $> /dev/null
echo "Add user $1 finished."
fi
練習1、通過命令行參數給定的兩個數字,輸出其中較大的數值;
第一種:
#!/bin/bash
#
if [ $# -lt 2 ]; then
echo "Two integers."
exit 2
fi
if [ $1 -ge $2 ]; then
echo "Max numeber: $1."
elese
echo "Max numeber: $2."
fi
第二種:
#!/bin/bash
#
if [ $# -lt 2 ]; then
echo "Two integers."
exit 2
fi
declare -i max=$1
if [ $1 -ge $2 ]; then
max=$1
else
max=$2
fi
echo "Max number: $max."
原創文章,作者:shadow,如若轉載,請注明出處:http://www.www58058.com/64546