初步學完shell腳本編程,通過這篇博客對其小結一下
shell定義:shell其實是一個命令解釋器,它的作用是解釋用戶輸入的命令和程序
shell腳本:我們可以在文本中輸入一系列的命令、控制語句和變量,這一切有機的結合起來就形成了功能強大的shell腳本。
一.基礎語法
1.查看系統腳本解釋器
常用的是bash解釋器
2.使用bash解釋器執行腳本的三種方式:
bash xx.sh
sh xx.sh
./xx.sh(注意是否有權限,沒有通過chmod 755 xx.sh 或chmod u+x xx.sh 添加權限)
3.shell中的變量
系統變量
$HOME 家目錄
$PWD 當前目錄
$SHELL 解釋器路徑
$USER 用戶
自定義變量
變量名=變量值 注意等號兩邊沒有空格
撤銷變量 unset 變量名
靜態變量
readonly 變量名=變量值(declare -r 變量名=變量值)
靜態變量不能撤銷,關機或運行完腳本自動失效
全局變量
變量名=變量值
export 變量名
特殊變量$
$n
n為數字,$0代表該腳本名稱,$1-$9代表第一到第九個命令行參數,第十個及以后的參數需要用大括號包含,如${10}
$#
獲取所有輸入參數的個數
$@ 和$*
$@和$*都表示命令行中所有的參數,一般看來沒有區別,for循環打印時都是一個個打印,但當用雙引號分別將他們括起來,"$@"是分裂的,不是一個整體(for i in "$@"),而“$*”是一個整體
$?
最后一次執行命令的返回狀態,如果值為0,證明命令執行正確,非0命令執行不正確
注意:函數中,函數的返回值只能有$?獲取,且返回值小於等於255。單獨比較大小時,結果也是由$?獲取
4.運算符
乘除加減
第一種方式:$((運算式))和$[運算式],運算符之間有沒有空格無所謂
第二種方式:`expr 變量1 +-*/% 變量2` 運算符之間有空格 ,要加反引號
條件判斷
[ condition ] 條件與兩端括號之間有空格
大小判斷
-lt 小於
-le 小於等於
-ge 大於等於
-gt 大於
-eq 等於
-ne 不等於
文件類型判斷
-f 文件存在且是一個常規文件
-e 文件存在
-d 文件存在是一個目錄
文件權限
-r 有讀的權限
-w 有寫的權限
-x 有執行的權限
多條件判斷
&& 與
|| 或
!邏輯否
5.流程控制
if語句
if [ 條件判斷式 ];then
fi
if [ 條件判斷式 ]
then
fi
if [ 條件判斷式 ]
then
else
fi
if [ 條件判斷式 ]
then
elif [ 條件判斷式 ]
then
fi
case語句
case $變量名 in
“值1”)
程序
;;
“值2”)
程序
;;
*)
都不是
;;
esac
for 循環
for ((初始值;條件;;變量變化))
do
程序
done
for 變量 in 值1 值2 值3
do
程序
done
while 循環
while [ 條件判斷式 ]
do
程序
done
讀取控制台輸入
read(選項)(參數) 變量
讀取輸入賦值給變量
-p 指示讀取值時的提示符
-t 指定讀取值時等待的時間
read相當於python中的input
read -t 7 -p “enter your choice” NAME
6.函數
系統函數
basename函數截取文件名稱
basename [string/pathname]
basename [string/pathname] [suffix]
basename 會只保存路徑的最后一項,只剩文件名
dirname 函數
dirname函數與basename作用相反,截取內容相反
獲取執行腳本的路徑
pw=$(cd `dirname $0`;pwd)
自定義函數
[function] funcname[()] function ,()可寫可不寫
{
程序
[return xx]
}
返回值由$?獲取,返回值(0-255)
注意:必須在調用函數地方之前,先聲明函數
一個腳本使用另一個腳本的函數
. 腳本名
函數名
二.shell工具
1.cut命令
cut 命令從文件的每一行剪切字節,字符等數據,並將符合的數據輸出
cut [選項參數] filename
默認分隔符是制表符
參數 -f 提取第幾列
-d 分隔符 按照指定分割符分割列
2.sed
sed是一種流編輯器,它一次處理一行內容把當前處理的行存儲在臨時緩沖區中,稱為模式空間,接着用sed 命令處理緩沖區中的內容,處理完成后,把緩沖區中的內容送往屏幕
接着處理下一行,這樣不斷重復,知道文件末尾,注意文件的內容沒有被改變,除非你使用重定向存儲輸出
sed [選項參數] 命令 filename
選項參數
-e 有多個命令時使用
-n 只顯示處理過的行
命令參數
a 新增
d 刪除
s 查找並替換
sed -n '1,/內容/'p 文件 顯示第一行到包含匹配內容的那一行
sed -n 'num'p 文件 顯示第num行
sed “na 內容” 文件名 在n行后加上內容
sed "s/舊 內容/新內容/g" 文件名 替換,g全局替換,否則只換一個
sed -e "nd" -e "s/舊內容/新內容/g" 文件名 刪掉第n行並替換內容
3.awk
awk是一個強大的文本分析工具,把文件逐行的讀入,以空格為默認分隔符,將每行切開,切開的部分再進行分析處理。
命令格式:
awk [選項參數] 'pattern{action1} pattern {action2}.....' 文件名
pattern 表示awk在數據中查找的內容,就是匹配模式 (/內容/ 是匹配格式)
action在找到匹配內容時所執行的一系列命令
在開始和結束地方加上新的內容
BEGIN 在所有數據讀取前執行,END在讀取所有數據后執行
awk的內置變量
FILENAME 文件名
NR 已讀的記錄數(執行到第幾行)
NF瀏覽記錄的域的個數(切割后,列的個數)
顯示文本空行行數與具體行號
提取特定文本
統計文本有幾行
查找文件空行所在的行號
$0代表一行所有內容,$1-$9代表第一列到第九列
sort 工具
將文件進行排序,並將排序結果標准輸出
sort(選項)(參數)
-n 依照數值大小排序
-r 以相反順序排序
-t 設置排序使用的分割字符
-k 指定需要排序的列
參數:指定需要排序的文件
求一列的和
三.shell中一些重要命令
重定向
>>追加
>寫入(覆蓋寫)
2> 重定向標准錯誤
2>>重定向標准錯誤
&>重定向標准輸出和標准錯誤
管道操作符號|
前面的內容交給后面處理
wc -l
判斷輸出內容有幾行
輸出命令echo
echo 內容 輸出一行默認換行
單獨echo 相當於空行
echo -e 內容 可以轉義字符 (\n,\t)
echo -n 內容 不轉義字符
echo 注意事項:
echo “內容” 與 echo '內容'區別
雙引號可以包含變量,但單引號不能解析變量
反引號可以解析命令
設置字體顏色
echo -e “\033[x;ym 內容 \033[0m”
x 字體顏色 30~37
y 背景顏色 40~47
head
輸出文件前10行
find
find 搜索區域 -name 文件名 以名字查詢文件(模糊查詢用*)
find 搜索區域 -perm 權限 根據權限查詢
find 搜索區域 -user 用戶 根據使用者查詢
find 搜索區域 -type 文件類型(d,f) 根據文件類型查找
find 搜索區域 -size 文件大小 根據文件大小查詢(+大於,-小於,c字節,k,M)
find 搜索區域 -mtime 時間 根據修改時間查找(+超過多少天,-在幾天內)
shell正則
grep “匹配內容” 文件名
grep -c ‘匹配內容’ 文件
grep -n ‘匹配內容’ 文件
grep -i "匹配內容" 文件 忽略大小寫
grep -v “內容xx” 文件 不包含內容xx的行(除去特定行)
grep -E “^xx”/"xx$" 以xx開始和以xx結束(-E代表使用正則)
grep -E ".+xx.+" 內容xx 在行中間
grep -E "^$" 文件 匹配空行
grep -E “(xx)+” 文件 匹配多次出現一次或多次xx的行
grep -E “(xx){num}” 文件 匹配連續出現num次的xx行
uniq命令
uniq -c 文件 打印緊挨着的重復行次數與內容(重復但隔着的不打印)
uniq -d 文件 只打印重復的行
split
split -n 被分割文件 保存文件 每n行分割,保存到文件中
查看 是否安裝服務
rpm -qa | grep 服務名
查看服務是否正常
nc -w num ip 端口名 有正常的顯示,服務正常
制作菜單
cat <<eof
內容
eof
cat <<eof 相當於echo,能一次輸出多行字符串,包括變量