linux下shell常用腳本命令及有關(guān)知識

一、需要記住的一些知識點
1、變量類型
運行shell時,會同時存在三種變量:
1) 局部變量
局部變量在腳本或命令中定義,僅在當前shell實例中有效,其他shell啟動的程序不能訪問局部變量。
2) 環(huán)境變量
所有的程序,包括shell啟動的程序,都能訪問環(huán)境變量,有些程序需要環(huán)境變量來保證其正常運行。必要的時候shell腳本也可以定義環(huán)境變量。
3) shell變量
shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環(huán)境變量,有一部分是局部變量,這些變量保證了shell的正常運行
2、shell變量說明
$$
Shell本身的PID(ProcessID)
$!
Shell最后運行的后臺Process的PID
$?
最后運行的命令的結(jié)束代碼(返回值)
$-
使用Set命令設定的Flag一覽
$*
所有參數(shù)列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數(shù)。
$@
所有參數(shù)列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數(shù)。
$#
添加到Shell的參數(shù)個數(shù)
$0
Shell本身的文件名
$1~$n
添加到Shell的各參數(shù)值。$1是第1參數(shù)、$2是第2參數(shù)…。
3、單引號和雙引號和反引號的區(qū)別
以單引號
' '包圍變量的值時,單引號里面是什么就輸出什么,即使內(nèi)容中有變量和命令(命令需要反引起來)也會把它們原樣輸出。
以雙引號" "包圍變量的值時,輸出時會先解析里面的變量和命令,而不是把雙引號中的變量名和命令原樣輸出。以反引號` `(在鍵盤esc下面),命令替換是指Shell可以先執(zhí)行命令,將輸出結(jié)果暫時保存,在適當?shù)牡胤捷敵觥?梢杂弥付ㄗ兞恐付?/p>
4、shell轉(zhuǎn)義字符
?\\?? ?反斜杠
\a?? ?警報,響鈴
\b?? ?退格(刪除鍵)
\f?? ?換頁(FF),將當前位置移到下頁開頭
\n?? ?換行
\r?? ?回車
\t?? ?水平制表符(tab鍵)?
\v?? ?垂直制表符
5、?算術(shù)運算符列表
運算符? ? ? ?說明? ? ? ? ? ? ? ? ? ? ? ? ?舉例
+? ? ? ? ? ?加法? ? ? ? ? ? ? ? ? ?`expr $a + $b` 結(jié)果為 30。
-? ? ? ? ? ? 減法? ? ? ? ? ? ? ? ?? `expr $a - $b` 結(jié)果為 10。
\*? ? ? ? ? ? 乘法? ? ? ? ? ? ? ? ? ?`expr $a \* $b` 結(jié)果為 ?200。
/? ? ? ? ? ??除法? ? ? ? ? ? ? ? ? ?`expr $b / $a` 結(jié)果為 2。
%? ? ? ? ? 取余? ? ? ? ? ? ? ? ? ?`expr $b % $a` 結(jié)果為 0。
=? ? ? ? ? ?賦值? ? ? ? ? ? ? ? ? ?a=$b 將把變量 b 的值賦給 a。
==? ? ? ? 相等。用于比較兩個數(shù)字,相同則返回 true。?? ?[ $a == $b ] 返回 false。
!=? ? ? ?? 不相等。用于比較兩個數(shù)字,不相同則返回 true。?? ?[ $a != $b ] 返回 true。
6、關(guān)系運算符
關(guān)系運算符只支持數(shù)字,不支持字符串,除非字符串的值是數(shù)字。
?運算符? ? ? ? ? ? ? 說明? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 舉例
-eq? ? ? 檢測兩個數(shù)是否相等,相等返回 true。? ? ? ? ? ? ? ? ? ? ? ? ? ? [ $a -eq $b ] 返回 true。
-ne? ? ? 檢測兩個數(shù)是否相等,不相等返回 true。? ? ? ? ? ? ? ? ? ? ? ? [ $a -ne $b ] 返回 true。
-gt? ? ?? 檢測左邊的數(shù)是否大于右邊的,如果是,則返回 true。?? ?[ $a -gt $b ] 返回 false。
-lt? ? ? ??檢測左邊的數(shù)是否小于右邊的,如果是,則返回 true。?? ?[ $a -lt $b ] 返回 true。
-ge? ? ? 檢測左邊的數(shù)是否大等于右邊的,如果是,則返回 true。?? ?[ $a -ge $b ] 返回 false。
-le? ? ? ?檢測左邊的數(shù)是否小于等于右邊的,如果是,則返回 true。?? ?[ $a -le $b ] 返回 true。
7、布爾運算符列表
運算符? ? ? ? ? ? ? ? ? ? ?說明? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 舉例
!? ? ? ?非運算,表達式為 true 則返回 false,否則返回 true。?? ?[ ! false ] 返回 true。
-o?? ?或運算,有一個表達式為 true 則返回 true。? ? ? ?[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a?? ?與運算,兩個表達式都為 true 才返回 true。? ? ? ?[ $a -lt 20 -a $b -gt 100 ] 返回 false。?
8、?文件測試運算符列表
操作符? ? ? ? ?說明? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?舉例
-b file?? ?檢測文件是否是塊設備文件,如果是,則返回 true。? ? ? ? ? ? ? ? ? ?[ -b $file ] 返回 false。
-c file?? ?檢測文件是否是字符設備文件,如果是,則返回 true。? ? ? ? ? ? ? ? [ -b $file ] 返回 false。
-d file?? ?檢測文件是否是目錄,如果是,則返回 true。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ -d $file ] 返回 false。
-f file?? ?檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。?? ?[ -f $file ] 返回 true。
-g file?? ?檢測文件是否設置了 SGID 位,如果是,則返回 true。? ? ? ? ? ? ? ? [ -g $file ] 返回 false。
-k file?? ?檢測文件是否設置了粘著位(Sticky Bit),如果是,則返回 true。? ?[ -k $file ] 返回 false。
-p file?? ?檢測文件是否是具名管道,如果是,則返回 true。? ? ? ? ? ? ? ? ? ? ? ?[ -p $file ] 返回 false。
-u file?? ?檢測文件是否設置了 SUID 位,如果是,則返回 true。? ? ? ? ? ? ? ? [ -u $file ] 返回 false。
-r file?? ?檢測文件是否可讀,如果是,則返回 true。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ -r $file ] 返回 true。
-w file?? ?檢測文件是否可寫,如果是,則返回 true。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[ -w $file ] 返回 true。
-x file?? ?檢測文件是否可執(zhí)行,如果是,則返回 true。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ -x $file ] 返回 true。
-s file?? ?檢測文件是否為空(文件大小是否大于0),不為空返回 true。? ?[ -s $file ] 返回 true。
-e file?? ?檢測文件(包括目錄)是否存在,如果是,則返回 true。? ? ? ? ? ? ?[ -e $file ] 返回 true。
二、常用腳本命令舉例說明
例子太長為了簡寫,只列舉一個
1、nginx的日志我們存儲在nginx.log里,統(tǒng)計出2020年4月23號的訪問ip次數(shù),并且按照次數(shù)降序排序
例:192.168.1.20 - - [21/Apr/2020:14:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
cat nginx.log | grep 23/Apr/2020 | awk -F "-" '{print $1}'|sort|uniq -c | sort -r | awk '{print $1,$2}'
2、nginx的日志我們存儲在nginx.log里,統(tǒng)計2020年04月23日20-23點的去重IP訪問量
例:192.168.1.20 - - [21/Apr/2020:14:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
cat nginx.log | grep 23/Apr/2020:2[0-3] | awk '{print $1}' | sort | uniq | wc -l
3、nginx的日志我們存儲在nginx.log里,寫腳本統(tǒng)計訪問3次以上的IP
例:192.168.1.20 - - [21/Apr/2020:14:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
cat nginx.log | awk '{print $1}'| sort | uniq -c | awk '{if ($1 >3) print $0}' | sort -r | awk '{print $1,$2}'
awk的數(shù)據(jù)字段變量
$0表示整行文本
$1表示文本中第一個數(shù)據(jù)字段
$2表示文本中第二個數(shù)據(jù)字段
$n表示文本中第n個數(shù)據(jù)字段
4、netstat命令運行的結(jié)果放在netstat.txt,查看和本機3306端口建立連接并且狀態(tài)是established的所有IP,按照連接數(shù)降序排序
例:tcp? ? ? ? 0? ? ? 0 172.16.56.200:41856? ? ?172.16.34.144:3306? ? ? ESTABLISHED
cat netstat.txt | grep ESTABLISHED | grep 3306 | awk '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c | sort -hr | awk '{print $1,$2}'
5、統(tǒng)計網(wǎng)段內(nèi)在用或者未用IP
#!/bin/bash for ip in `seq 0 255` do ping -c 1 -i 0 192.168.2.$ip if [ $? -eq 0 ] then echo "192.168.2.$ip" >> /root/up.txt else echo "192.168.2.$ip" >> /root/down.txt fi done
6、讀取文件行數(shù),一行行的循環(huán)讀取
例:cat http
www.baidu.com
www.cityhouse.cn
www.cityre.cn
vim htttp.sh
cat /data/script/http | while read line do curl $line done date=`date "+%Y-%m-%d-%H-%M-%S"` echo "sucessful$date" >> /data/script/http.txt
到此這篇關(guān)于linux下shell常用腳本命令及有關(guān)知識的文章就介紹到這了,更多相關(guān)inux下shell腳本命令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux使用watch命令監(jiān)控Docker容器狀態(tài)的操作方法
在現(xiàn)代的開發(fā)和運維環(huán)境中,容器化技術(shù)已經(jīng)成為一種重要的趨勢,而Docker作為最流行的容器化平臺之一,Linux中的watch命令就是一個非常有用的工具,它可以幫助我們定期執(zhí)行指定的命令,并全屏顯示輸出,本文給大家介紹了在Linux中使用watch命令監(jiān)控Docker容器狀態(tài)2024-10-10
centos7 PHP環(huán)境搭建 GD庫 等插件安裝方法
下面小編就為大家分享一篇centos7 PHP環(huán)境搭建 GD庫 等插件安裝方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
Linux下安裝IPython配置python開發(fā)環(huán)境教程
這篇文章主要為大家詳細介紹了Linux下安裝IPython配置python開發(fā)環(huán)境教程,需要的朋友可以參考下2016-05-05

