Shell Script,Shell腳本與Windows/Dos下的批處理類似,也就是用各種命令預先放入到一個文件中,方便一次性執行的一個程序文件,主要是方便管理員進行設置或者管理用的。可是它比Windows下的批處理更強大,比用其餘編程程序編輯的程序效率更高,畢竟它使用了Linux/Unix下的命令。
換一種說法也就是,shell script是利用shell的功能所寫的一個程序,這個程序是使用純文本文件,將一些shell的語法與指令寫在裏面,而後用正規表示法,管線命令以及數據流重導向等功能,以達到咱們所想要的處理目的 html
shell是什麼呢?確切一點說,Shell就是一個命令行解釋器,它的做用就是遵循必定的語法將輸入的命令加以解釋並傳給系統。它爲用戶提供了一個向Linux發送請求以便運行程序的接口系統級程序,用戶能夠用Shell來啓動、掛起、中止甚3至是編寫一些程序。 Shell自己是一個用C語言編寫的程序,它是用戶使用Linux的橋樑。Shell既是一種命令語言,又是一種程序設計語言(就是你所說的shell腳本)。做爲命令語言,它互動式地解釋和執行用戶輸入的命令;做爲程序設計語言,它定義了各類變量和參數,並提供了許多在高階語言中才具備的控制結構,包括循環和分支。它雖然不是 Linux系統內核的一部分,但它調用了系統內核的大部分功能來執行程序、建立文檔並以並行的方式協調各個程序的運行。linux
交互式模式就是shell等待你的輸入,而且執行你提交的命令。這種模式被稱做交互式是由於shell與用戶進行交互。這種模式也是大多數用戶很是熟悉的:登陸、執行一些命令、簽退。當你簽退後,shell也終止了。
shell也能夠運行在另一種模式:非交互式模式。在這種模式下,shell不與你進行交互,而是讀取存放在文件中的命令,而且執行它們。當它讀到文件的結尾,shell也就終止了。
以下:
簡單的實現系統巡檢的命令:
date正則表達式
[root@linuxprobe ~]# date 2020年 03月 30日 星期一 13:00:48 CST
free –mshell
[root@linuxprobe ~]# free -m total used free shared buffers cached Mem: 1826 1268 558 10 7 388 -/+ buffers/cache: 871 954 Swap: 2047 0 2047
df –Th編程
[root@linuxprobe ~]# df -Th 文件系統 類型 容量 已用 可用 已用% 掛載點 /dev/mapper/rhel_linuxprobe-root xfs 18G 3.8G 14G 22% / devtmpfs devtmpfs 905M 4.0K 905M 1% /dev tmpfs tmpfs 914M 140K 914M 1% /dev/shm tmpfs tmpfs 914M 8.9M 905M 1% /run tmpfs tmpfs 914M 0 914M 0% /sys/fs/cgroup /dev/sr0 iso9660 3.5G 3.5G 0 100% /mnt /dev/sda1 xfs 497M 125M 373M 26% /boot
寫成一個簡單的腳本test.sh
#!/bin/bash
date
free –m
df –Th
chmod +x test.sh
./test.shbash
[root@linuxprobe ~]# ./test.sh 2020年 03月 30日 星期一 13:02:50 CST total used free shared buffers cached Mem: 1826 1266 560 10 7 388 -/+ buffers/cache: 870 956 Swap: 2047 0 2047 文件系統 類型 容量 已用 可用 已用% 掛載點 /dev/mapper/rhel_linuxprobe-root xfs 18G 3.8G 14G 22% / devtmpfs devtmpfs 905M 4.0K 905M 1% /dev tmpfs tmpfs 914M 140K 914M 1% /dev/shm tmpfs tmpfs 914M 8.9M 905M 1% /run tmpfs tmpfs 914M 0 914M 0% /sys/fs/cgroup /dev/sr0 iso9660 3.5G 3.5G 0 100% /mnt /dev/sda1 xfs 497M 125M 373M 26% /boot
-e filename 若是 filename存在,則爲真
-d filename 若是 filename爲目錄,則爲真
-f filename 若是 filename爲常規文件,則爲真
-L filename 若是 filename爲符號連接,則爲真
-r filename 若是 filename可讀,則爲真
-w filename 若是 filename可寫,則爲真
-x filename 若是 filename可執行,則爲真
-s filename 若是文件長度不爲0,則爲真
-h filename 若是文件是軟連接,則爲真
filename1 -nt filename2 若是 filename1比 filename2新,則爲真。
filename1 -ot filename2 若是 filename1比 filename2舊,則爲真。
-eq 等於
-ne 不等於
-gt 大於
-ge 大於等於
-lt 小於
-le 小於等於服務器
1.求/etc/passwd文件第20行內容app
[root@linuxprobe ~]# cat -n /etc/passwd | head -20 | tail -1 20 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
rev左右顛倒測試
tac上下顛倒ui
經常使用選項
-name
-type
-user
-nouser
-group
-nogroup
-mtime
-size
可使用 -o 或者 -a 鏈接多個條件
可使用-exec或者-ok來執行shell命令
find /etc/ -name hosts -exec cp {} /tmp/ \;
如:
find /var/logs -type f -mtime +7 -exec rm {} \;
*/10 * * * * 腳本|命令
當在前臺運行某個做業時,終端被該做業佔據;而在後臺運行做業時,它不會佔據終端。
xclock -update 1 & 後臺運行
若是你正在運行一個進程,並且你以爲在退出賬戶時該進程還不會結束,那麼可使用 n o h u p命令。該命令能夠在你退出賬戶以後繼續運行相應的進程。 N o h u p就是不掛起的意思( n o hang up)。
該命令的通常形式爲: nohup command &
nohup xclock -update 1 &
*
?
[...]和[!...] [a-z] [0-9] [!a12d]
{..}
-e 使轉義符生效 如: 解釋\t \n含義
-n 不換行輸出
字顏色:30—–37
echo -e 「\033[30m 黑色字 \033[0m」
echo -e 「\033[31m 紅色字 \033[0m」
echo -e 「\033[32m 綠色字 \033[0m」
echo -e 「\033[33m 黃色字 \033[0m」
echo -e 「\033[34m 藍色字 \033[0m」
echo -e 「\033[35m 紫色字 \033[0m」
echo -e 「\033[36m 天藍字 \033[0m」
echo -e 「\033[37m 白色字 \033[0m」
[root@linuxprobe ~]# echo -e "\033[31m 紅色字 \033[0m" 紅色字
字背景顏色範圍:40—–47
echo -e 「\033[40;37m 黑底白字 \033[0m」
echo -e 「\033[41;37m 紅底白字 \033[0m」
echo -e 「\033[42;37m 綠底白字 \033[0m」
echo -e 「\033[43;37m 黃底白字 \033[0m」
echo -e 「\033[44;37m 藍底白字 \033[0m」
echo -e 「\033[45;37m 紫底白字 \033[0m」
echo -e 「\033[46;37m 天藍底白字 \033[0m」
echo -e 「\033[47;30m 白底黑字 \033[0m
[root@linuxprobe ~]# echo -e "\033[41;37m 紅底白字 \033[0m" 紅底白字
[root@linuxprobe ~]# printf aa
aa[root@linuxprobe ~]#
[root@linuxprobe ~]# printf "aa\n" aa
格式化輸出
[root@linuxprobe ~]# printf "%s,%s,%d\n" good job 123 good,job,123
%s 字符串 %d十進制整數
可使用read語句從鍵盤或文件的某一行文本中讀入信息,並將其賦給一個變量。若是隻指定了一個變量,那麼 read將會把全部的輸入賦給該變量,直至遇到第一個文件結束符或回車。
如:
賦值
[root@linuxprobe ~]# read name zhang san [root@linuxprobe ~]# echo $name zhang san
賦多值
[root@linuxprobe ~]# read firstname lastname zhang san [root@linuxprobe ~]# echo $firstname $lastname zhang san [root@linuxprobe ~]# echo $firstname zhang [root@linuxprobe ~]# echo $lastname san
交互式
[root@linuxprobe ~]# read -p "輸入姓名: " name 輸入姓名: zhang san [root@linuxprobe ~]# echo $name zhang san
管道(Pipe)實際是用於進程間通訊的一段共享內存. 建立管道的進程稱爲管道服務器,鏈接到一個管道的進程爲管道客戶機
管道命令的兩個做用:
1.管道兩邊產生兩個子進程
2.前一個進程的標準輸出和後一個進程的標準輸入
注意如下狀況不能賦值
echo 123 | read aa
echo $aa
文件描述符:進程鏈接到文件時,得到的一個標記.當進程操做文件時,首先
打開文件 得到打開文件的一個狀態,給它一個標記 成爲文件描述符
0標準輸入
1標準輸出
2標準錯誤輸出
> >> 定向符(重定向) >覆蓋 >>追加
1> 標準正確輸出,文件存在則覆蓋,不存在則建立
1>> 標準正確輸出,文件存在則追加,不存在則建立
2> 標準錯誤輸出,文件存在則覆蓋,不存在則建立
2>> 標準錯誤輸出,文件存在則追加,不存在則建立
&> 標準正確和標準錯誤輸出,文件存在則覆蓋,不存在則建立
cat < /dev/sda > /dev/null 測試改變文件描述符
ls >cleanup.out 2>&1
在上面的例子中,咱們將 ls命令的輸出重定向到 cleanup.out文件中,並且其錯誤也 被重定向到相同的文件中。
2>&1 標準錯誤輸出定向到標準正確輸出
< 輸入重定向 後邊跟的是文件 > >>
<< here document 後邊跟的是一個文本
以下
[root@linuxprobe ~]# cat >a.txt <<EOF > dsadsadsa > cxzcxzcxz > qwewqewqe > EOF [root@linuxprobe ~]# cat a.txt dsadsadsa cxzcxzcxz qwewqewqe
[[root@linuxprobe ~]# fdisk /dev/sda <<EOF
> n
>
> +200M
> w
> EOF
<<<here string 後邊跟字符串 直接交給文本 如:
[root@linuxprobe ~]# cat>a.txt <<<kkkkk [root@linuxprobe ~]# cat a.txt kkkkk
tee命令做用能夠用字母 T來形象地表示。它把輸出的一個副本輸送到標準輸出,另外一個 副本拷貝到相應的文件中。若是但願在看到輸出的同時,也將其存入一個文件, 這種狀況可使用tee命令
如:
[root@linuxprobe ~]# who | tee aa.txt root :0 2020-03-31 17:01 (:0) root pts/0 2020-03-31 17:01 (:0) [root@linuxprobe ~]# cat aa.txt root :0 2020-03-31 17:01 (:0) root pts/0 2020-03-31 17:01 (:0)
[root@linuxprobe ~]# find /etc -name hosts | tee bb.txt /etc/avahi/hosts /etc/hosts [root@linuxprobe ~]# cat bb.txt /etc/avahi/hosts /etc/hosts
Linux sort命令用於將文本文件內容加以排序。
sort可針對文本文件的內容,以行爲單位來排序。
sort [-bcdfimMnr][-o<輸出文件>][-t<分隔字符>][+<起始欄位>-<結束欄位>][--help][--verison][文件]
[root@linuxprobe ~]# cat aa.txt 2 4 3 21 90 78 45 23 2 3 5 1 [root@linuxprobe ~]# sort aa.txt 1 2 2 21 23 3 3 4 45 5 78 90 [root@linuxprobe ~]# sort -n aa.txt 1 2 2 3 3 4 5 21 23 45 78 90 [root@linuxprobe ~]# sort -n -r aa.txt 按完整數字排序 降序 90 78 45root 23 21 5 4 3 3 2 2 1 [root@linuxprobe ~]# sort -u aa.txt 去掉重複值 1 2 21 23 3 4 45 5 78 90
[root@linuxprobe ~]# sort -t: -k3nr /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
never:x:1004:1004::/home/never:/bin/bash
shitianle:x:1003:1003::/home/shitianle:/bin/bash
tom:x:1002:1002::/home/tom:/bin/bash
Linux uniq 命令用於檢查及刪除文本文件中重複出現的行列,通常與 sort 命令結合使用。
uniq 可檢查文本文件中重複出現的行列。
uniq [-cdu][-f<欄位>][-s<字符位置>][-w<字符位置>][--help][--version][輸入文件][輸出文件]
[root@linuxprobe ~]# cat qq.txt 2 4 4 3 3 21 90 78 45 23 2 3 5 1 [root@linuxprobe ~]# sort -n qq.txt |uniq -u 1 5 21 23 45 78 90 [root@linuxprobe ~]# cat qq.txt 2 4 4 3 3 21 90 78 45 23 2 3 5 1 [root@linuxprobe ~]# sort -n qq.txt | uniq -d 2 3 4 [root@linuxprobe ~]# sort -n qq.txt | uniq -d -c 2 2 3 3 2 4
linux grep 命令用於查找文件裏符合條件的字符串。
grep 指令用於查找內容包含指定的範本樣式的文件,若是發現某文件的內容符合所指定的範本樣式,預設 grep 指令會把含有範本樣式的那一列顯示出來。若不指定任何文件名稱,或是所給予的文件名爲 -,則 grep 指令會從標準輸入設備讀取數據。
grep [-abcEFGhHilLnqrsvVwxy][-A<顯示列數>][-B<顯示列數>][-C<顯示列數>][-d<進行動做>][-e<範本樣式>][-f<範本文件>][--help][範本樣式][文件或目錄...]
[root@linuxprobe ~]# grep ^root /etc/passwd root:x:0:0:root:/root:/bin/bash [root@linuxprobe ~]# grep halt$ /etc/passwd halt:x:7:0:halt:/sbin:/sbin/halt [root@linuxprobe ~]# grep -A 2 root /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin -- operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@linuxprobe ~]# grep -B 2 root /etc/passwd root:x:0:0:root:/root:/bin/bash -- halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [root@linuxprobe ~]# grep -C 2 root /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin -- halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@linuxprobe ~]# grep -c root /etc/passwd 2
Linux cut命令用於顯示每行從開頭算起 num1 到 num2 的文字。
cut [-bn] [file] cut [-c] [file] cut [-df] [file]
使用說明:
cut 命令從文件的每一行剪切字節、字符和字段並將這些字節、字符和字段寫至標準輸出。
若是不指定 File 參數,cut 命令將讀取標準輸入。必須指定 -b、-c 或 -f 標誌之一。
參數:
[root@linuxprobe ~]# head -10 /etc/passwd| cut -d: -f 1,3 root:0 bin:1 daemon:2 adm:3 lp:4 sync:5 shutdown:6 halt:7 mail:8 operator:11 [root@linuxprobe ~]# head -10 /etc/passwd| cut -d: -f 1-3 root:x:0 bin:x:1 daemon:x:2 adm:x:3 lp:x:4 sync:x:5 shutdown:x:6 halt:x:7 mail:x:8 operator:x:11
Linux tr 命令用於轉換或刪除文件中的字符。
tr 指令從標準輸入設備讀取數據,通過字符串轉譯後,將結果輸出到標準輸出設備。
tr [-cdst][--help][--version][第一字符集][第二字符集] tr [OPTION]…SET1[SET2]
字符集合的範圍:
[root@linuxprobe ~]# echo helooooooo worddddddd | tr -s [a-z] helo word [root@linuxprobe ~]# head -10 /etc/passwd |tr [a-z] [A-Z] ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC SHUTDOWN:X:6:0:SHUTDOWN:/SBIN:/SBIN/SHUTDOWN HALT:X:7:0:HALT:/SBIN:/SBIN/HALT MAIL:X:8:12:MAIL:/VAR/SPOOL/MAIL:/SBIN/NOLOGIN OPERATOR:X:11:0:OPERATOR:/ROOT:/SBIN/NOLOGIN
Linux wc命令用於計算字數。
利用wc指令咱們能夠計算文件的Byte數、字數、或是列數,若不指定文件名稱、或是所給予的文件名爲"-",則wc指令會從標準輸入設備讀取數據。
wc [-clw][--help][--version][文件...]
統計/tmp目錄下文件的個數(數目中包含目錄自己)
[root@linuxprobe ~]# ls -l /tmp/ |wc -l 56
inux split命令用於將一個文件分割成數個。
該指令將大文件分割成較小的文件,在默認狀況下將按照每1000行切割成一個小文件。
split [--help][--version][-<行數>][-b <字節>][-C <字節>][-l <行數>][要切割的文件][輸出文件名]
[root@linuxprobe ~]#cat /etc/passwd >> zz.txt [root@linuxprobe ~]# split -6 zz.txt [root@linuxprobe ~]# ls zz.txt xaa xae xab xaf xac xag xad xah
Linux eval命令用於從新運算求出參數的內容。
eval可讀取一連串的參數,而後再依參數自己的特性來執行。
eval [參數]
[root@linuxprobe ~]# aa="tail -1 /etc/passwd" [root@linuxprobe ~]# echo $aa tail -1 /etc/passwd [root@linuxprobe ~]# eval $aa never:x:1004:1004::/home/never:/bin/bash
Linux date命令能夠用來顯示或設定系統的日期與時間,在顯示方面,使用者能夠設定欲顯示的格式,格式設定爲一個加號後接數個標記,其中可用的標記列表以下:
時間方面:
[root@linuxprobe ~]# date 2020年 03月 31日 星期二 19:32:14 CST [root@linuxprobe ~]# date +%F-%H:%M:%S 2020-03-31-19:34:17 [root@linuxprobe ~]# date +%F-%H:%M:%S 2020-03-31-19:34:17
bc 命令是任意精度計算器語言,一般在linux下當計算器用。
它相似基本的計算器, 使用這個計算器能夠作基本的數學運算。
經常使用的運算:
[root@linuxprobe ~]# bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 3-1 2 2*2 4 3*3 9 2/2 1 5/2 2 5%2 1 5^2 25
輸入 quit 退出。
小數:
[root@linuxprobe ~]# bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. scale=5 7/3 2.33333
轉換進制:
[root@linuxprobe ~]# bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. ibase=10;obase=2 10 1010 2 10
非交互式:
[root@linuxprobe ~]# echo "3*3" | bc 9
||邏輯或 前邊命令失敗執行後邊命令
&&邏輯與 前邊命令成功運行後邊命令