課程內容:
shell
一、bash編程入門之變量類型、for循環和算術計算
express
二、bash編程入門之邏輯運算和條件判斷
編程
三、bash條件測試
bash
四、bash條件測試
ide
1、bash編程入門之變量類型、for循環和算術計算測試
bash弱類型:ui
變量=值(任何無需事先聲明,可直接使用;值默認都是字符型 a=abc a=3)this
普通賦值:a=4 spa
加強性賦值:命令行
字符: a=$[$a+1] +=、-=、*=、/=、%= a=$a+1 等同於a+=1
字符串: export PATH=$PATH:/usr/local/bin
自加:var++ 、var--
unset 撤銷變量賦值(不然一直佔用內存)
算術運算:bash會對數字執行隱式的類型轉換
let VAR_NAME=Integer_value 定義整型
declare -i Var_name=Integer_value 定義整型
操做符:+ - * / %(取模) **(次方) 雙目運算符(須要至少2個操做數)
算術運算的方式:
let Var_Name=expression
Var_Name=$[expression]
$((expression)) 如:echo 「the sum is: $(($sum1+$sun2))」
for循環:
新建10個用戶:tuser601-yuser610
for username in ;do
useradd $username
done
遍歷list元素,遍歷結束,循環退出。
#for i in `seq 601 610`; do echo $i;done
#for i in `seq 601 610`; do echo user$i;done
#for i in `seq 601 610`; do useradd tuser$i;done
#for i in {601..610};do useradd tuser$i;done
bash中的字串鏈接方式:
#strl='hello' #str2='bash'
#echo "$str1 $str2" 結果爲:hello bash
#echo '$str1 $str2' 結果爲:$hello $bash
#animal=pig 變量引用後方跟直接字串時,變量名要加{}
#echo "there are some ${ainimal}s" 顯示There are some pigs. #{}指定變量範圍
求100之內全部正整數的和:
分析:聲明一個變量賦值爲0,而後讓該變量加1,再加2,再加3…………加100,加到最後就是咱們問題所要的結果。
declare -i sum=0
for i in {i..100};do
let sum+=$i
done
echo $sum
練習:分別計算100之內全部偶數之和奇數之和;
#!/bin/bash
declare -i evensum=0
declare -i oddsum=0
for i in `seq 1 2 100`;do
oddsum=$[$oddsum+$i]
done
for i in `seq 1 2 100`;do
evensum=$[$evensum+$i]
done
echo "evensum: $evensum,oddsum:$oddsum."
練習:計算當前系統上全部用戶的ID之和
#!/bin/bash
declare -i idsum=0
for i in `cut -d: -f3 /etc/passwd`;do
let idsum+=$i 或者 idsum=$[$idsum+$userid]
done
echo $idsum
練習:新建10個用戶user401-410,並求他們的ID之和
練習:寫一個腳本,
一、建立用戶user501-510
二、建立目錄/tmp/dir-當前日期時間
三、在/tmp/dir-當前日期時間目錄中建立10個空文件file101-110
四、將file101的屬主改爲user501,一次類推。
練習:寫一個腳本
一、腳本能夠接受一個以上的文件路徑做爲參數;
二、顯示每一個文件所擁有的行數;
三、顯示本次共對多少個文件執行了行數統計;
四、顯示全部文件的總行數;
#!/bin/bash
#
declare -i totalLines=0
declare -i noFiles=0
for file in $*; do
curFileLines=`wc -l $file | cut -d' ' -f1`
echo "$file has $curFileLines."
let noFiles++
let totalLines+=$curFileLines
done
echo "Total Files: $noFiles."
echo "Total Lines: $totalLines."
練習:新建10個用戶tuser401-tuser410,並求他們的ID之和;
#!/bin/bash
#
declare -i idsum=0
for i in {401..410}; do
useradd tuser$i
userID=`id -u tuser$i`
let idsum+=$userID
done
echo "ID sum: $idsum."
練習:寫一個腳本
一、建立用戶tuser501-tuser510;
二、建立目錄/tmp/dir-當前日期時間;
三、在/tmp/dir-當前日期時間 目錄中建立9個空文件file101-file110
四、將file101的屬主改成tuser501,依次類推,一直將file110的屬主改成tuser510;
練習:寫一個腳本
分別統計/etc/rc.d/rc.sysinit、/etc/rc.d/init.d/functions和/etc/inittab文件中以# 開頭的行的行數和空白行數;
#!/bin/bash
for file in /etc/rc.d/rc.sysinit /etc/rc.d/init.d/functions /etc/inittab; do
echo "The lines contain # in $file is `grep -E "^#" $file | wc -l`."
echo "The space lines in $file is `grep -E "^[[:space:]]*$" $file | wc -l`."
done
練習:寫一個腳本
顯示當前系統上全部默認shell爲bash的用戶的用戶名、UID及其全部此類用戶的UID之和;
#!/bin/bash
#
grep "/bin/bash$" /etc/passwd | cut -d: -f1,3
declare -i sum=0
for userID in `grep "/bin/bash$" /etc/passwd | cut -d: -f3`; do
let sum+=$userID
done
echo "$sum"
2、bash編程入門之邏輯運算和條件判斷
一、邏輯運算:布爾運算:2種狀態真、假
與、或、非、異或
與運算:
真,假:
真 && 真 = 真
真 && 假 = 假
假 && 真 = 假
假 && 假 = 假
或運算:
真,假
真 || 真 = 真
真 || 假 = 真
假 || 真 = 真
假 || 假 = 假
非運算:
真,假
異或運算:
命令都有其狀態返回值:(成功:0,真 失敗:1-255, 假)
bash條件測試:
命令執行成功與否即爲條件測試
test EXPR
[ EXPR ]
` EXPR `
比較運算:
>, <, >=, <=, ==, !=
測試類型:根據比較時的操做數的類型
整型測試:整數比較
字符測試:字符串比較
文件測試:判斷文件的存在性及屬性等
注意:比較運算一般只在同一種類型間進行
整型測試:
-gt: 例如 [ $num1 -gt $num2 ]
-lt:
-ge:
-le:
-eq:
-ne:
字符串測試:
雙目
>: [[ "$str1" > "$str2" ]]
<:
>=
<=
==
!=
單目:
-n String: 是否不空,不空則爲真,空則爲假
-z String: 是否爲空,空則爲真,不空則假
過程式編程:
順序
選擇
循環:for
選擇:if和case
if: 三種使用格式
單分支的if語句:
if 測試條件; then
選擇分支
fi
表示條件測試狀態返回值爲值,則執行選擇分支;
if ! id $username &> /dev/null; then
useradd $username
fi
練習:寫一個腳本,接受一個參數,這個參數是用戶名;若是此用戶存在,則顯示其ID號;
雙分支的if語句:
if 測試條件; then
選擇分支1
else
選擇分支2
fi
兩個分支僅執行其中之一。
練習:經過命令行傳遞兩個整數參數給腳本,腳本能夠返回其大者。
練習:經過命令行傳遞任意個整數給腳本,腳本能夠返回其大者。
練習:經過命令行給定一個文件路徑,然後判斷:
若是此文件中存在空白行,則顯示其空白行的總數;
不然,則顯示無空白行;
if grep "^[[:space]]*$" $1 &> /dev/null; then
echo "$1 has $(grep "^[[:space]]*$" $1 | wc -l) blank lines."
else
echo "No blank lines"
fi
注意:若是把命令執行成功與否看成條件,則if語句後必須只跟命令自己,而不能引用。
if [ $(grep "^[[:space:]]*$" $1 | wc -l) -lt 1 ]
多分支的if語句:
if 條件1; then
分支1
elif 條件2; then
分支2
elif 條件3; then
分支3
...
else
分支n
fi
練習:傳遞一個參數給腳本:
若是參數爲quit,則顯示說你要退出;
若是參數爲yes,則顯示說你要繼續
其它任意參數,則說沒法識別;
練習:傳遞一個用戶名給腳本:
若是此用戶的id號爲0,則顯示說這是管理員
若是此用戶的id號大於等於500,則顯示說這是普通用戶
不然,則說這是系統用戶;
#!/bin/bash
#
if [ $# -lt 1 ]; then
echo "Usage: `basename $0` username"
exit 1
fi
if ! id -u $1 &> /dev/null; then
echo "Usage: `basename $0` username"
echo "No this user $1."
exit 2
fi
if [ $(id -u $1) -eq 0 ]; then
echo "Admin"
elif [ $(id -u $1) -ge 500 ]; then
echo "Common user."
else
echo "System user."
fi
if 測試條件; then
測試條件:在bash中是命令 (test EXPR, [ EXPR ] ) 或由 ` EXPR `
if 命令;
在bash運行至if時,其後的命令會被執行,其狀態結果則做爲判斷標準:
0:表示真
1-255:表示假
若是條件包含比較之意,則必須使用自定義shell進程的狀態返回值:exit [n]
3、條件測試