2018.03.12
rpm httpd***
service httpd start
ab
模仿用戶訪問
cat /var/log/httpd/access_log
curl
訪問web服務
rev 字符顛倒顯示
sort
? -r 執行反方向(由上至下)整理
? -R 隨機排序
? -n 執行按數字大小整理
? -f 選項忽略(fold)字符串中的字符大小寫
? -u 選項(獨特,unique)刪除輸出中的重復行
? -t c 選項使用c做為字段界定符
? -k X 選項按照使用c字符分隔的X列來整理能夠使用多次
wc
計數
seq
生成序列
last
用戶登陸情況
/dev.null
垃圾桶
nmap
網絡掃描工具
nmap -v -sP 172.16.101.0/24
grep
? –color=auto: 對匹配到的文本著色顯示
? -v: 顯示不被pattern匹配到的行
? -i: 忽略字符大小寫
? -n:顯示匹配的行號
? -c: 統計匹配的行數
? -o: 僅顯示匹配到的字符串
? -q: 靜默模式,不輸出任何信息
? -A #: after, 后#行
? -B #: before, 前#行
? -C #:context, 前后各#行
? -e:實現多個選項間的邏輯or關系
grep –e ‘cat ’ -e ‘dog’ file
? -w:匹配整個單詞
? -E:使用ERE
? -F:相當于fgrep,不支持正則表達式
正則表達式
? 字符匹配:
. 匹配任意單個字符
[] 匹配指定范圍內的任意單個字符
[^] 匹配指定范圍外的任意單個字符
[:alnum:] 字母和數字
[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z
[:lower:] 小寫字母 [:upper:] 大寫字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)
[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴…)
[:digit:] 十進制數字 [:xdigit:]十六進制數字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 標點符號
?匹配次數:用在要指定次數的字符后面,用于指定前面的字符要出現的次數
* 匹配前面的字符任意次,包括0次
貪婪模式:盡可能長的匹配
.* 任意長度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次
例:
ifconfig | grep -Eow “([0-9]{1,3}\.){3}[0-9]{1,3}”
篩選出所有的IP
?位置錨定:定位出現的位置
^ 行首錨定,用于模式的最左側
$ 行尾錨定,用于模式的最右側
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或 \b 詞首錨定,用于單詞模式的左側
\> 或 \b 詞尾錨定;用于單詞模式的右側
\<PATTERN\> 匹配整個單詞
/t 水平空格
/v 垂直空格
cat /etc/passwd|grep -E ‘(root).*\1.*’
root連續出現兩次
df|grep -E ‘^/dev/sd’|grep -Eo ‘[0-9]{1,3}%’|cut -d% -f1
取出占用率
cat /boot/grub2/grub.cfg | grep -E ‘[[:space:]]+\<linux16\>’|grep -v ‘rescue’
?分組:\(\) 將一個或多個字符捆綁在一起,當作一個整體進行處理,如:
\(root\)\+
?分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這
些變量的命名方式為: \1, \2, \3, …
?\1 表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符
?示例: \(string1\+\(string2\)*\)
\1 :string1\+\(string2\)*
\2 :string2
?后向引用:引用前面的分組括號中的模式所匹配字符,而非模式本身
?或者:\|
示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat
ls /media/CentOS_6.9_Final/Packages/|grep -Eo ‘\.[[:alnum:]_]+.rpm$’|cut -d. -f2|sort|uniq
結果:
i686
noarch
x86_64
第二種:
ls /media/CentOS_6.9_Final/Packages/*.rpm|rev|cut -d. -f2|rev|sort|uniq
第三種
ls /media/CentOS_6.9_Final/Packages/*.rpm|grep -Eo ‘\.[^.]+\.rpm$’|cut -d. -f 2|sort| uniq
vim
?按“:”進入Ex模式
?創建一個命令提示符: 處于底部的屏幕左側
?命令:
w 寫(存)磁盤文件
wq 寫入并退出
x 寫入并退出
q 退出
q! 不存盤退出,即使更改都將丟失
r filename 讀文件內容到當前文件中
w filename 將當前文件內容寫入另一個文件
!command 執行命令
r!command 讀入命令的輸出
?行首行尾跳轉:
^: 跳轉至行首的第一個非空白字符
0: 跳轉至行首
$: 跳轉至行尾
?行間移動:
#G、擴展模式:# :跳轉至由#指定行
G:最后一行
1G, gg: 第一行
?句間移動:
):下一句 (:上一句
?段落間移動:
}:下一段 {:上一段
?字符編輯:
x: 刪除光標處的字符
#x: 刪除光標處起始的#個字符
xp: 交換光標所在處的字符及其后面字符的位置
~:轉換大小寫
J:刪除當前行后的換行符
?替換命令(r, replace)
r: 替換光標所在處的字符
R:切換成REPLACE模式
d
y
p
c
?地址定界
:start_pos,end_pos
# 具體第#行,例如2表示第2行
#,# 從左側#表示起始行,到右側#表示結尾行
#,+# 從左側#表示的起始行,加上右側#表示的行數
:2,+3 表示2到5行
. 當前行
$ 最后一行
.,$-1 當前行到倒數第二行
% 全文, 相當于1,$
?/pat1/,/pat2/
從第一次被pat1模式匹配到的行開始,一直到第一次被pat2匹配到的行結
束
#,/pat/
/pat/,$
?使用方式:后跟一個編輯命令
d y
w file: 將范圍內的行另存至指定文件中
r file:在指定位置插入指定文件中的所有內容
?查找
/PATTERN:從當前光標所在處向文件尾部查找
?PATTERN:從當前光標所在處向文件首部查找
n:與命令同方向
N:與命令反方向
?s: 在擴展模式下完成查找替換操作
格式:s/要查找的內容/替換為的內容/修飾符
要查找的內容:可使用模式
替換為的內容:不能使用模式,但可以使用\1, \2, …等后向引用符號;還可
以使用“&” 引用前面查找時查找到的整個內容
修飾符:
i: 忽略大小寫
g: 全局替換;默認情況下,每一行只替換第一次出現
gc:全局替換,每次替換前詢問
?查找替換中的分隔符/可替換為其它字符,例如
s@/etc@/var@g
s#/boot#/#i
sed
?用法:
sed [option]… ‘script’ inputfile…
?常用選項:
-n:不輸出模式空間內容到屏幕,即不自動打印
-e: 多點編輯
-f:/PATH/SCRIPT_FILE: 從指定文件中讀取編輯腳本
-r: 支持使用擴展正則表達式
-i.bak: 備份文件并原處編輯
?script:
‘地址命令
?地址定界:
(1) 不給地址:對全文進行處理
(2) 單地址:
#: 指定的行,$:最后一行
/pattern/:被此處模式所能夠匹配到的每一行
(3) 地址范圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步進
1~2 奇數行
2~2 偶數行
? 編輯命令:
d: 刪除模式空間匹配的行,并立即啟用下一輪循環
p:打印當前模式空間內容,追加到默認輸出之后
a [\]text:在指定行后面追加文本
支持使用\n實現多行追加
i [\]text:在行前面插入文本
c [\]text:替換行為單行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile:讀取指定文件的文本至模式空間中
匹配到的行后
=: 為模式空間中的行打印行號
!:模式空間中匹配行取反處理
?s///:查找替換,支持使用其它分隔符,s@@@,s###
?替換標記:
g: 行內全局替換
p: 顯示替換成功的行
w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中
在GRUB_CMDLINE_LINUX選項后加入 net.ifnames=0參數
cat /etc/default/grub |sed -r ‘s@(GRUB_CMDLINE_LINUX.*)\”$@\1 net.ifnames=0\”@’
第二種寫法
cat /etc/default/grub |sed -r ‘/GRUB_CMDLINE_LINUX/s@”$@ net.ifnames=0&@’
ifconfig eth0|sed -n ‘2p’|sed -r -e’s@.*addr\>:@@’ -e ‘s@\<Bcast.*@@’
cat /data/httpd.conf |sed -r -e ‘s@^#(NameVirtualHost \*:80)@ \1@’ -e ‘/#<VirtualHost/,/#<\/VirtualHost\>/s@^#(.*)@\1@’
或
cat /data/httpd.conf |sed -r -e ‘s@^#(NameVirtualHost \*:80)@ \1@’ -e ‘/^#<VirtualHost/,/^#<\/VirtualHost\>/s@#@@’
刪除塊注釋
2018.03.14
sed高級編輯命令
?P:打印模式空間開端至\n內容,并追加到默認輸出之前
?h: 把模式空間中的內容覆蓋至保持空間中
?H:把模式空間中的內容追加至保持空間中
?g: 從保持空間取出數據覆蓋至模式空間
?G:從保持空間取出內容追加至模式空間
?x: 把模式空間中的內容與保持空間中的內容進行互換
?n: 讀取匹配到的行的下一行覆蓋至模式空間
?N:讀取匹配到的行的下一行追加至模式空間
?d: 刪除模式空間中的行
?D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,
并不會讀取新的輸入行,而使用合成的模式空間重新啟動循環。如果模式空間
不包含換行符,則會像發出d命令那樣啟動正常的新循環
待處理:解釋每個命令作用
?sed -n ‘n;p’ FILE
打印偶數行
?sed ‘1!G;h;$!d’ FILE
?sed ‘N;D‘ FILE
?sed ‘$!N;$!D’ FILE
?sed ‘$!d’ FILE
?sed ‘G’ FILE
?sed ‘g’ FILE
?sed ‘/^$/d;G’ FILE
?sed ‘n;d’ FILE
?sed -n ‘1!G;h;$p’ FILE
awk
? 選項:
-F 指明輸入時用到的字段分隔符
-v var=value: 自定義變量
?基本格式:awk [options] ‘program’ file…
?program:pattern{action statements;..}
?pattern和action:
? pattern部分決定動作語句何時觸發及觸發事件
BEGIN,END
? action statements對數據進行處理,放在{}內指明
print, printf
?分割符、域和記錄
? awk執行時,由分隔符分隔的字段(域)標記$1,$2..$n稱為
域標識。 $0為所有域,注意:和shell中變量$符含義不同
? 文件的每一行稱為記錄
? 省略action,則默認執行 print $0 的操作
awk變量
? 變量:內置和自定義變量
? FS:輸入字段分隔符,默認為空白字符
awk -v FS=’:’ ‘{print $1,FS,$3}’ /etc/passwd
awk –F: ‘{print $1,$3,$7}’ /etc/passwd
? OFS:輸出字段分隔符,默認為空白字符
awk -v FS=‘:’ -v OFS=‘:’ ‘{print $1,$3,$7}’ /etc/passwd
? RS:輸入記錄分隔符,指定輸入時的換行符
awk -v RS=’ ‘ ‘{print }’ /etc/passwd
? ORS:輸出記錄分隔符,輸出時用指定符號代替換行符
awk -v RS=’ ‘ -v ORS=’###’‘{print }’ /etc/passwd
? NF:字段數量
awk -F: ‘{print NF}’ /etc/fstab,引用內置變量不用$
awk -F: ‘{print $(NF-1)}’ /etc/passwd
? NR:記錄號
awk ‘{print NR}’ /etc/fstab ; awk END'{print NR}’ /etc/fstab
?FNR:各文件分別計數,記錄號
awk ‘{print FNR}’ /etc/fstab /etc/inittab
?FILENAME:當前文件名
awk ‘{print FILENAME}’ /etc/fstab
?ARGC:命令行參數的個數
awk ‘{print ARGC}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
?ARGV:數組,保存的是命令行所給定的各參數
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
?自定義變量(區分字符大小寫)
(1) -v var=value
(2) 在program中直接定義
?示例:
awk -v test=’hello gawk’ ‘{print test}’ /etc/fstab
awk -v test=’hello gawk’ ‘BEGIN{print test}’
awk ‘BEGIN{test=”hello,gawk”;print test}’
awk –F:‘{sex=“male”;print $1,sex,age;age=18}’
/etc/passwd
cat awkscript
{print script,$1,$2}
awk -F: -f awkscript script=“awk” /etc/passwd
? 格式化輸出:printf “FORMAT” , item1, item2, …
(1) 必須指定FORMAT
(2) 不會自動換行,需要顯式給出換行控制符,\n
(3) FORMAT中需要分別為后面每個item指定格式符
? 格式符:與item一一對應
%c: 顯示字符的ASCII碼
%d, %i: 顯示十進制整數
%e, %E:顯示科學計數法數值
%f:顯示為浮點數
%g, %G:以科學計數法或浮點形式顯示數值
%s:顯示字符串
%u:無符號整數
%%: 顯示%自身
? 修飾符:
#[.#]:第一個數字控制顯示的寬度;第二個#表示小數點后精度,%3.1f
-: 左對齊(默認右對齊) %-15s
+:顯示數值的正負符號 %+d
?模式匹配符:
~:左邊是否和右邊匹配包含 !~:是否不匹配
?示例:
awk –F: ‘$0 ~ /root/{print $1}‘ /etc/passwd
awk ‘$0~“^root”‘ /etc/passwd
awk ‘$0 !~ /root/‘ /etc/passwd
awk –F: ‘$3==0’ /etc/passwd
? 邏輯操作符:與&&,或||,非!
? 示例:
? awk –F: ‘$3>=0 && $3<=1000 {print $1}’ /etc/passwd
? awk -F: ‘$3==0 || $3>=1000 {print $1}’ /etc/passwd
? awk -F: ‘!($3==0) {print $1}’ /etc/passwd
? awk -F: ‘!($3>=500) {print $3}’ /etc/passwd
? 函數調用: function_name(argu1, argu2, …)
? 條件表達式(三目表達式):
selector?if-true-expression:if-false-expression
? 示例:
awk -F: ‘{$3>=1000?usertype=”Common User”:usertype=”Sysadmin or SysUser”;printf
“%15s:%-s\n”,$1,usertype}’ /etc/passwd
? PATTERN:根據pattern條件,過濾匹配的行,再做處理
(1)如果未指定:空模式,匹配每一行
(2) /regular expression/:僅處理能夠模式匹配到的行,需要用/ /括起來
awk ‘/^UUID/{print $1}’ /etc/fstab
awk ‘!/^UUID/{print $1}’ /etc/fstab
(3) relational expression: 關系表達式,結果為“真”才會被處理
真:結果為非0值,非空字符串
假:結果為空字符串或0值
?4) line ranges:行范圍
startline,endline:/pat1/,/pat2/ 不支持直接給出數字格
式
awk -F: ‘/^root\>/,/^nobody\>/{print $1}’
/etc/passwd
awk -F: ‘(NR>=10&&NR<=20){print NR,$1}’
/etc/passwd
?(5) BEGIN/END模式
BEGIN{}: 僅在開始處理文件中的文本之前執行一次
END{}:僅在文本處理完成之后執行一次
awk控制語句
?{ statements;… } 組合語句
?if(condition) {statements;…}
?if(condition) {statements;…} else {statements;…}
?while(conditon) {statments;…}
?do {statements;…} while(condition)
?for(expr1;expr2;expr3) {statements;…}
?break
?continue
?delete array[index]
?delete array
?exit
awk函數
? 數值處理:
rand():返回0和1之間一個隨機數
awk ‘BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }’
? 字符串處理:
? length([s]):返回指定字符串的長度
? sub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,并將第一個匹配的內容替換為s
echo “2008:08:08 08:08:08” | awk ‘sub(/:/,“-“,$1)’
? gsub(r,s,[t]):對t字符串進行搜索r表示的模式匹配的內容,并全部替換為s所表示的內容
echo “2008:08:08 08:08:08” | awk ‘gsub(/:/,“-“,$0)’
? split(s,array,[r]):以r為分隔符,切割字符串s,并將切割后的結果保存至array所表示的數組中,
第一個索引值為1,第二個索引值為2,…
netstat -tan | awk ‘/^tcp\>/{split($5,ip,”:”);count[ip[1]]++}
END{for (i in count) {print i,count[i]}}
rpm
?數據庫(公共):/var/lib/rpm
程序包名稱及版本
依賴關系
功能說明
包安裝后生成的各文件路徑及校驗碼信息
?[install-options]
–test: 測試安裝,但不真正執行安裝,即dry run模式
–nodeps:忽略依賴關系
–replacepkgs | replacefiles
–nosignature: 不檢查來源合法性
–nodigest:不檢查包完整性
–noscripts:不執行程序包腳本
%pre: 安裝前腳本; –nopre
%post: 安裝后腳本; –nopost
%preun: 卸載前腳本; –nopreun
%postun: 卸載后腳本; –nopostun
?升級:
?rpm {-U|–upgrade} [install-options] PACKAGE_FILE…
?rpm {-F|–freshen} [install-options] PACKAGE_FILE…
upgrade:安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則“安裝”
freshen:安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則不執行升級操作
rpm -Uvh PACKAGE_FILE …
rpm -Fvh PACKAGE_FILE …
–oldpackage:降級
–force: 強制安裝
?注意:
(1) 不要對內核做升級操作;Linux支持多內核版本并存,因此,對直接安裝新版
本內核
(2) 如果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配
置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名
(FILENAME.rpmnew)后保留
包查詢
?rpm {-q|–query} [select-options] [query-options]
?[select-options]
-a: 所有包
-f: 查看指定的文件由哪個程序包安裝生成
-p rpmfile:針對尚未安裝的程序包文件做查詢操作
–whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供
–whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴
?rpm2cpio 包文件|cpio –itv 預覽包內文件
?rpm2cpio 包文件|cpio –id “*.conf” 釋放包內文件
cpio
?[query-options]
–changelog:查詢rpm包的changelog
-c: 查詢程序的配置文件
-d: 查詢程序的文檔
-i: information
-l: 查看指定的程序包安裝后生成的所有文件
–scripts:程序包自帶的腳本
–provides: 列出指定程序包所提供的CAPABILITY
-R: 查詢指定的程序包所依賴的CAPABILITY
?常用查詢用法:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, …
-qa
?包卸載:
rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts] [–notriggers]
[–test] PACKAGE_NAME …
包校驗
?rpm {-V|–verify} [select-options] [verify-options]
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
P capabilities differ
?數據庫重建:
/var/lib/rpm
?rpm {–initdb|–rebuilddb}
initdb: 初始化
如果事先不存在數據庫,則新建之
否則,不執行任何操作
rebuilddb:重建已安裝的包頭的數據庫索引目錄
yum
yum客戶端配置文件:
/etc/yum.conf:為所有倉庫提供公共配置
/etc/yum.repos.d/*.repo:為倉庫的指向提供配置
倉庫指向的定義:
[repositoryID]
name=Some name for this repository
baseurl=url://path/to/repository/
enabled={1|0}
gpgcheck={1|0}
gpgkey=URL
enablegroups={1|0}
failovermethod={roundrobin|priority}
roundrobin:意為隨機挑選,默認值
priority:按順序訪問
cost= 默認為1000
?yum的repo配置文件中可用的變量:
$releasever: 當前OS的發行版的主版本號
$arch: 平臺,i386,i486,i586,x86_64等
$basearch:基礎平臺;i386, x86_64
$YUM0-$YUM9:自定義變量
啟動autofs服務
訪問/misc/cd 自動掛載軟盤
yum clean all
清除yum緩存
?創建yum倉庫:
createrepo [options] <directory>
2018.03.16
編譯安裝
?C語言源代碼編譯安裝三步驟:
1、 ./configure
(1) 通過選項傳遞參數,指定啟用特性、安裝路徑等;執行時會參考用戶的
指定以及Makefile.in文件生成Makefile
(2) 檢查依賴到的外部環境,如依賴的軟件包
2、 make 根據Makefile文件,構建應用程序
3、 make install 復制文件到相應路徑
wget? 下載http/https資源
./configure –help
常用:
–prefix=
make -j 4
指定4個線程并發編譯
ss -ntl
查看端口
CentO S7 關閉防火墻
systemctl disable firewalld
SHELL腳本
格式要求:首行shebang機制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
?檢測腳本中的語法錯誤
bash -n /path/to/some_script
?調試執行
bash -x /path/to/some_script
查看進程樹
pstree -p
技巧:變量使用完畢后應unset
$*和$@的區別:
$*后的變量為一個整體
$@的不變,仍可認為是獨立的位置變量
并且 使用時兩邊要用“”包圍
?根據變量的生效范圍等標準劃分下面變量類型:
局部變量:
生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell的子shell進程均無效
環境(全局)變量:
生效范圍為當前shell進程及其子進程
?變量聲明、賦值:
export name=VALUE
declare -x name=VALUE
?變量引用:
$name, ${name}
?顯示所有環境變量:
env
printenv
export
declare -x
?刪除變量:
unset name
?bash內建的環境變量:
? PATH
? SHELL
? USER
? UID
? HOME
? PWD
? SHLVL:SHELL層級
? LANG
? MAIL
? HOSTNAME
? HISTSIZE
? — 默認himBH 每個字母有單獨含義,共5個系統設定項
本地變量:
生效范圍為當前shell進程中某代碼片斷,通常指函數
位置變量:
? 聲明只讀變量:
readonly name
declare -r name
? 查看只讀變量:
readonly –p
$1, $2, …來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數
$1, $2, …:對應第1、第2等參數,shift [n]換位置
$0: 命令本身
$*: 傳遞給腳本的所有參數,全部參數合為一個字符串
$@: 傳遞給腳本的所有參數,每個參數為獨立字符串
$#: 傳遞給腳本的參數的個數
$@ $* 只在被雙引號包起來的時候才會有差異
set — 清空所有位置變量
特殊變量:
$?, $0, $*, $@, $#,$$
顯示已定義的所有變量:set
?bash自定義退出狀態碼
exit [n]:自定義退出狀態碼
注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出狀態取決于exit命
令后面的數字
注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行
的最后一條命令的狀態碼
?短路運算
短路與
第一個為0,結果必定為0
第一個為1,第二個必須要參與運算
短路或
第一個為1,結果必定為1
第一個為0,第二個必須要參與運算
異或:^
異或的兩個值,相同為假,不同為真
實現算術運算:
(1) let var=算術表達式
(2) var=$[算術表達式]
(3) var=$((算術表達式))
(4) var=$(expr arg1 arg2 arg3 …)
(5) declare –i var = 數值
(6) echo ‘算術表達式’ | bc
條件測試
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]] 如果包含正則表達式,需用第三種格式
注意:EXPRESSION前后必須有空白字符
?-v VAR
變量VAR是否設置
?數值測試:
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
字符串測試:
== 是否等于
> ascii碼是否大于ascii碼
< 是否小于
!= 是否不等于
=~ 左側字符串是否能夠被右側的PATTERN所匹配
注意: 此表達式一般用于[[ ]]中;擴展的正則表達式
-z “STRING“ 字符串是否為空,空為真,不空為假
-n “STRING“ 字符串是否不空,不空為真,空為假
? 注意:用于字符串比較時的用到的操作數都應該使用引號
?存在性測試
-a FILE:同-e
-e FILE: 文件存在性測試,存在為真,否則為假
?存在性及類別測試
-b FILE:是否存在且為塊設備文件
-c FILE:是否存在且為字符設備文件
-d FILE:是否存在且為目錄文件
-f FILE:是否存在且為普通文件
-h FILE 或 -L FILE:存在且為符號鏈接文件
-p FILE:是否存在且為命名管道文件
-S FILE:是否存在且為套接字文件
?文件權限測試:
-r FILE:是否存在且可讀
-w FILE: 是否存在且可寫
-x FILE: 是否存在且可執行
?文件特殊權限測試:
-u FILE:是否存在且擁有suid權限
-g FILE:是否存在且擁有sgid權限
-k FILE:是否存在且擁有sticky權限
?文件大小測試:
-s FILE: 是否存在且非空
?文件是否打開:
-t fd: fd 文件描述符是否在某終端已經打開
-N FILE:文件自從上一次被讀取之后是否被修改過
-O FILE:當前有效用戶是否為文件屬主
-G FILE:當前有效用戶是否為文件屬組
?雙目測試:
FILE1 -ef FILE2: FILE1是否是FILE2的硬鏈接
FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2: FILE1是否舊于FILE2
組合測試條件:
?第一種方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]]
?第二種方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必須使用測試命令進行
例:
#!/bin/bash
str=`df | awk ‘/^\/dev\/sd/{print $5}’|cut -d% -f1|sort -nr |uniq|head -n 1`
#test $str -gt 10 && wall haha
[ $str -gt ‘9’? ] && wall haha
位運算交換兩個變量:
a=6
b=8
a=$(a^b)
b=$(a^b)
a=$(a^b)
條件判斷:
case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
…
*)
默認分支
;;
esc
action 字符
打印綠色OK字樣
action 字符 /bin/false
打印紅色FALSE字樣
fork炸彈
?函數實現
:(){ :|:& };:
bomb() { bomb | bomb & }; bomb
?腳本實現
cat Bomb.sh
#!/bin/bash
./$0|./$0&
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/92521