一周學會shell編程之小結1
內容:
shell腳本創建與執行
變量
條件測試
if,case判斷語句
練習
檢查錯誤:
bash -n path
調試執行:
bash -x path
創建shell腳本步驟:
1 添加第一行 #!/bin/bash
2 給予執行權限,再運行。
source ./path 在本地shell運行
. path 本地shell運行
./path 開啟子進程運行shell腳本
path 開啟子進程運行腳本
變量:本質是一段命名的內存空間
不同類型的變量存儲方式也不同。
變量分為 字符型和數值類型(分為整型和浮點型)
按照作用范圍,變量分為本地變量,環境變量,局部變量,位置變量,特殊變量
本地變量:生效范圍僅為當前shell進程
環境變量:生效范圍為當前shell及子進程
局部變量:生效范圍僅為局部代碼塊
位置變量:$1,$2 用于腳本在腳本代碼中調用命令行傳遞給他的參數。
特殊變量:$?–最后一個命令執行的返回值(為0代表正確,為其他代表錯誤)
$0–shell文件本身的名字
$$ –shell本身運行的PID
$!–shell最后運行的后臺的PID
$#–添加到shell參數的個數
$*–引用所有添加的參數,用一個字符串表示
$@–引用所有添加的字符串,用多個字符串分開表示
變量的賦值:
變量賦值時前面不加$。
引用字符串:
name=’abc’
引用變量
name=$b
引用命令
name=`cat /etc/fstab`或者name=$(cat /etc/fstab)
顯示已經定義的所有變量:set
刪除變量:unset
定義變量和刪除變量不需要加$
環境變量:
聲明:
export name=value
declare -x name=value
查看所有環境變量:
env,export
只讀變量:
聲明:
readonly name
declare -r name
實現算數運算:
(1) let var=算術表達式
(2) var=$[算術表達式]
(3) var=$((算術表達式))
(4) var=$(expr arg1 arg2 arg3 …)
(5) declare – i var = 數值
(6) echo ‘算術表達式’ | bc
$RANDOM隨機生成數
賦值表達式時需要加let
邏輯運算:
短路運算: 短
路與: 第一個為0,結果必定為0; 第一個為1,第二個必須要參與運算;
短路或: 第一個為1,結果必定為1; 第一個為0,第二個必須要參與運算; v
異或:^ 異或的兩個值,相同為假,不同為真
條件測試:
判斷某需求是否滿足,需要由測試機制來實現;
專用的測試表達式需要由測試命令輔助完成測試過程; v
評估布爾聲明,以便用在條件性執行中
若真,則返回0 若假,則返回1 v
測試命令:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
注意:EXPRESSION前后必須有空白字符
數值測試:
-gt: 是否大于;
-ge: 是否大于等于;
-eq: 是否等于;
-ne: 是否不等于;
-lt: 是否小于;
-le: 是否小于等于;
字符串測試:
==:是否等于;
>: ascii碼是否大于ascii碼
<: 是否小于
!=: 是否不等于
=~: 左側字符串是否能夠被右側的PATTERN所匹配
注意: 此表達式一般用于[[ ]]中;而且不支持錨定位置,除了行首行尾錨定。
!也只能用在[ [ ] ] 中時,需要放在里面的括號中,如果使用[],需要放在外面。
-z "STRING":字符串是否為空,空為真,不空為假
-n "STRING":字符串是否不空,不空為真,空為假
注意:用于字符串比較時的用到的操作數都應該使用引號
文件測試:
存在性測試 -a FILE:同-e –
e FILE: 文件存在性測試,存在為真,否則為假; v
存在性及類別測試
-b FILE:是否存在且為塊設備文件;
-c FILE:是否存在且為字符設備文件;
-d FILE:是否存在且為目錄文件;
-f FILE:是否存在且為普通文件;
-h FILE 或 -L FILE:存在且為符號鏈接文件;
-p FILE:是否存在且為命名管道文件;
-S FILE:是否存在且為套接字文件;
文件權限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行 v
文件特殊權限測試:
-g FILE:是否存在且擁有sgid權限;
-u FILE:是否存在且擁有suid權限;
-k FILE:是否存在且擁有sticky權限;
文件大小測試:
-s FILE: 是否存在且非空; v
文件是否打開:
-t fd: fd表示文件描述符是否已經打開且與某終端相關
-N FILE:文件自動上一次被讀取之后是否被修改過
-O FILE:當前有效用戶是否為文件屬主
-G FILE:當前有效用戶是否為文件屬組
雙目測試:
FILE1 -ef FILE2: FILE1與FILE2是否指向同一個設備上的相同inode
FILE1 -nt FILE2: FILE1是否新于FILE2;
FILE1 -ot FILE2: FILE1是否舊于FILE2;
使用read命令來接受輸入 v
使用read來把輸入值分配給一個或多個shell變量:
-p 指定要顯示的提示
-t TIMEOUT read 從標準輸入中讀取值,給每個單詞分配一個變量 所有剩余單詞都被分配給最后一個變量
read -p “Enter a filename: “ FILE
過程式編程語言:
執行方式分為:順序執行 選擇執行 循環執行
選擇執行:
注意:if語句可嵌套 v
單分支
if 判斷條件:hen 條件為真的分支代碼
fi v
雙分支
if 判斷條件; then 條件為真的分支代碼
else 條件為假的分支代碼
fi
多分支
if CONDITION1; then
if-true
elif CONDITION2; then
if-ture
elif CONDITION3; then
if-ture …
else all-false
fi v
逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而后結束整個if語句。
case語句:
case 變量引用 in
PAT1) 分支1
;;
PAT2) 分支2
;; …
*) 默認分支
;;
esac
練習:
1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信 息,包括主機名,IPv4地址,操作系統版本,內核版本, CPU型號,內存大小,硬盤大小。
v#!/bin/bash
ht=$HOSTNAME
ip=`ifconfig|sed -n '2p'|cut -d: -f2|cut -d'B' -f1`
sver=`cat /etc/redhat-release`
kver=`cat /proc/version|cut -d' ' -f3`
cpu=`lscpu|egrep "Model name"|cut -d: -f2|egrep -o "[^ ].*"`
mem=`free|sed -n '2p'|tr -s ' '|cut -d' ' -f2`
disk=` lsblk|sed -n '3p'|tr -s " "|cut -d' ' -f4`
echo "the hostname is;$ht"
echo "the ip is:$ip"
echo "the system version is: $sver"
echo "the kenel version is: $kver"
echo "the cpu model is: $cpu "
echo "the memory_total is: $mem"
echo "the disk_total is: $disk"
2、編寫腳本/root/bin/backup.sh,可實現每日將/etc/目錄 備份到/root/etcYYYY-mm-dd中
#!/bin/bash
echo "start to copy!"
cp -a /etc /root/etc`date +%F`
echo "over"
3、編寫腳本/root/bin/disk.sh,顯示當前硬盤分區中空間利 用率最大的值
#!/bin/bash
echo `df|egrep "^/"|tr -s " "|cut -d' ' -f5|sort -n|tail -1`
4、編寫腳本/root/bin/links.sh,顯示正連接本主機的每個遠 程主機的IPv4地址和連接數,并按連接數從大到小排序
#!/bin/bash
echo "the result is:"
echo `netstat -nt|egrep "^tcp"|tr -s " "|cut -d" " -f4|cut -d: -f1|sort|uniq -c|sort -n|tr -d " "`
練習1:寫一個腳本/root/bin/sumid.sh,計算/etc/passwd 文件中的第10個用戶和第20用戶的ID之和 v
#!/bin/bash
s10=`cat /etc/passwd|sed -n -e '10p' -e '20p'|cut -d: -f3|sed -n '1p'`
s20=`cat /etc/passwd|sed -n -e '10p' -e '20p'|cut -d: -f3|sed -n '2p'`
sum=$[$s10+$s20]
echo "the sum is: $sum"
練習2:寫一個腳本/root/bin/sumspace.sh,傳遞兩個文件 路徑作為參數給腳本,計算這兩個文件中所有空白行之和#!/bin/bash
path1=$1
path2=$2
l1=`cat $path1|egrep -c "^$"`
l2=`cat $path2|egrep -c "^$"`
sumspace=$[$l1+$l2]
echo "the sumspace is: $sumspace" v
練習3:寫一個腳本/root/bin/sumfile.sh,統計/etc, /var, /usr目錄中共有多少個一級子目錄和文件
#!/bin/bash
s1=`ls -ld /etc/* |wc -l`
s2=`ls -ld /var/* |wc -l`
s3=`ls -ld /usr/* |wc -l`
sumfile=$[$s1+$s2+$s3]
echo "the sumfile is:$sumfile"
1、寫一個腳本/root/bin/argsnum.sh,接受一個文件路徑作 為參數;如果參數個數小于1,則提示用戶“至少應該給一個 參數”,并立即退出;如果參數個數不小于1,則顯示第一個 參數所指向的文件中的空白行數
v#!/bin/bash
[ $# -lt 1 ] && echo "at least an argument! `exit`" || echo `cat $1|egrep -c "^$"` >2 /dev/null
2、寫一個腳本/root/bin/hostping.sh,接受一個主機的 IPv4地址做為參數,測試是否可連通。如果能ping通,則提 示用戶“該IP地址可訪問”;如果不可ping通,則提示用戶“ 該IP地址不可訪問”
#!/bin/bash
[ $# -lt 1 ] && { echo "need an argument";exit;} || echo "start to test" && ping -c1 -w2 $1 &>/dev/null && echo "accessible" || echo "not accessible"
1、chmod -rw /tmp/file1,編寫腳本/root/bin/per.sh,判 斷當前用戶對/tmp/fiile1文件 是否不可讀且不可寫 v
#!/bin/bash
path=/tmp/file
[ ! -r $path -a ! -w $path ] && echo "right" || echo "fail"
2、編寫腳本/root/bin/nologin.sh和login.sh,實現禁止和充 許普通用戶登錄系統。
#!/bin/bash
rm -f /etc/nologin
echo "allow login"
#!/bin/bash
touch /etc/nologin
echo "nologin!"
1、寫一個腳本/root/bin/createuser.sh,實現如下功能: 使用一個用戶名做為參數,如果指定參數的用戶存在,就顯 示其存在,否則添加之;顯示添加的用戶的id號等信息
v#!/bin/bash
read -p "please input the username:" name
if getent passwd $name &>/dev/null;then
echo "the user is already exisit"
else
useradd $name
echo `id $name`
fi
2、寫一個腳本/root/bin/yesorno.sh,提示用戶輸入yes或 no,并判斷用戶輸入的是yes還是no,或是其它信息 v
#!/bin/bash
read -p "please input the info:" info
if [[ $info =~ ^[yY][eE][sS]$ ]] ;then
echo "yes"
elif [[ $info =~ ^[Nn][Oo]$ ]] ;then
echo "no"
else
echo "wrong"
fi
3、寫一個腳本/root/bin/filetype.sh,判斷用戶輸入文件路 徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)
#!/bin/bash
read -p "please input the path:" path
! [ -a $path ] && { echo "the file is not exit";exit; } || type=`ls -ld $path|cut -c 1`
case $type in
l)
echo "link file"
;;
d)
echo "directory"
;;
-)
echo "common file"
;;
*)
echo "other file"
;;
esac
4、寫一個腳本/root/bin/checkint.sh,判斷用戶輸入的參數 是否為正整數
#!/bin/bash
read -p "please input a number:" num
[[ "$num" =~ ^[0-9]*[1-9][0-9]*$ ]] && echo "good number" || echo "bad number!"
10、判斷硬盤的每個分區空間和inode的利用率是否大于80,如果是,發郵件通知root磁盤滿
#!/bin/bash
spa_use=`df|tr -s " "|cut -d' ' -f5|egrep -o "[[:digit:]]+"|sort -n|tail -1`
iuse=`df -i|tr -s " "|cut -d' ' -f5|egrep -o "[[:digit:]]+"|sort -n|tail -1`
[ $spa_use -ge 3 ] || [ $iuse -ge 80 ] && echo "the disk is overload!" | mail -s "warning!" root || echo "everything is ok!"
11、指定文件做為參數,判斷文件是否為.sh后綴,如果是,添加x權限
#!/bin/bash
read -p "input the file:" path
[[ ! -a $path ]] && { echo "the file is not exsist";exit;} || [[ $path =~ .*sh$ ]] && { chmod +x $path;echo "add x right!"; } || echo "not a .sh file"
12、計算1+2+3+…+100
#!/bin/bash
echo "start working"
echo "the resulet is:`seq -s "+" 1 100|bc`"
13、輸入起始值A和最后值B,計算從A+(A+1)…+(B-1)+B的總和
#!/bin/bash
read -p "please input the number:" a b
[ $a -lt $b ] && echo "the result is: `seq -s "+" $a $b|bc`" || echo "the bad number!"
原創文章,作者:liuzhuo,如若轉載,請注明出處:http://www.www58058.com/35417
文章思路清晰,結構命令,排版整潔。