##############################################################################
#BASH CHEATSHEET (中文速查表)? -? by skywind (created on 2018/02/14)
#Version: 46, Last Modified: 2019/02/25 16:53
#https://github.com/skywind3000/awesome-cheatsheets
##############################################################################
##############################################################################
#常用快捷鍵(默認(rèn)使用 Emacs 鍵位)
##############################################################################
CTRL+A#移動(dòng)到行首衩匣,同
CTRL+B#向后移動(dòng)田炭,同
CTRL+C#結(jié)束當(dāng)前命令
CTRL+D#刪除光標(biāo)前的字符,同 茂翔,或者沒有內(nèi)容時(shí)驰吓,退出會(huì)話
CTRL+E#移動(dòng)到行末涧尿,同
CTRL+F#向前移動(dòng),同
CTRL+G#退出當(dāng)前編輯(比如正在 CTRL+R 搜索歷史時(shí))
CTRL+H#刪除光標(biāo)左邊的字符檬贰,同
CTRL+K#刪除光標(biāo)位置到行末的內(nèi)容
CTRL+L#清屏并重新顯示
CTRL+N#移動(dòng)到命令歷史的下一行现斋,同
CTRL+O#類似回車偎蘸,但是會(huì)顯示下一行歷史
CTRL+P#移動(dòng)到命令歷史的上一行庄蹋,同
CTRL+R#歷史命令反向搜索,使用 CTRL+G 退出搜索
CTRL+S#歷史命令正向搜索迷雪,使用 CTRL+G 退出搜索
CTRL+T#交換前后兩個(gè)字符
CTRL+U#刪除字符到行首
CTRL+V#輸入字符字面量限书,先按 CTRL+V 再按任意鍵
CTRL+W#刪除光標(biāo)左邊的一個(gè)單詞
CTRL+X#列出可能的補(bǔ)全
CTRL+Y#粘貼前面 CTRL+u/k/w 刪除過的內(nèi)容
CTRL+Z#暫停前臺(tái)進(jìn)程返回 bash,需要時(shí)可用 fg 將其切換回前臺(tái)
CTRL+_#撤銷(undo)章咧,有的終端將 CTRL+_ 映射為 CTRL+/ 或 CTRL+7
ALT+b#向后(左邊)移動(dòng)一個(gè)單詞
ALT+d#刪除光標(biāo)后(右邊)一個(gè)單詞
ALT+f#向前(右邊)移動(dòng)一個(gè)單詞
ALT+t#交換字符
ALT+BACKSPACE#刪除光標(biāo)前面一個(gè)單詞倦西,類似 CTRL+W,但不影響剪貼板
CTRL+X CTRL+X#連續(xù)按兩次 CTRL+X赁严,光標(biāo)在當(dāng)前位置和行首來回跳轉(zhuǎn)
CTRL+X CTRL+E#用你指定的編輯器扰柠,編輯當(dāng)前命令
##############################################################################
#BASH 基本操作
##############################################################################
exit#退出當(dāng)前登陸
env#顯示環(huán)境變量
echo$SHELL#顯示你在使用什么 SHELL
bash#使用 bash,用 exit 返回
which bash#搜索 $PATH疼约,查找哪個(gè)程序?qū)?yīng)命令 bash
whereis bash#搜索可執(zhí)行卤档,頭文件和幫助信息的位置,使用系統(tǒng)內(nèi)建數(shù)據(jù)庫(kù)
whatis bash#查看某個(gè)命令的解釋程剥,一句話告訴你這是干什么的
clear#清初屏幕內(nèi)容
reset#重置終端(當(dāng)你不小心 cat 了一個(gè)二進(jìn)制劝枣,終端狀態(tài)亂掉時(shí)使用)
##############################################################################
#目錄操作
##############################################################################
cd#返回自己 $HOME 目錄
cd{dirname}#進(jìn)入目錄
pwd#顯示當(dāng)前所在目錄
mkdir {dirname}#創(chuàng)建目錄
mkdir -p {dirname}#遞歸創(chuàng)建目錄
pushd{dirname}#目錄壓棧并進(jìn)入新目錄
popd#彈出并進(jìn)入棧頂?shù)哪夸?/p>
dirs-v#列出當(dāng)前目錄棧
cd-#回到之前的目錄
cd-{N}#切換到目錄棧中的第 N個(gè)目錄,比如 cd -2 將切換到第二個(gè)
##############################################################################
#文件操作
##############################################################################
ls#顯示當(dāng)前目錄內(nèi)容,后面可接目錄名:ls {dir} 顯示指定目錄
ls -l#列表方式顯示目錄內(nèi)容舔腾,包括文件日期溪胶,大小,權(quán)限等信息
ls -1#列表方式顯示目錄內(nèi)容稳诚,只顯示文件名稱哗脖,減號(hào)后面是數(shù)字 1
ls -a#顯示所有文件和目錄,包括隱藏文件(.開頭的文件/目錄名)
ln -s {fn} {link}#給指定文件創(chuàng)建一個(gè)軟鏈接
cp {src} {dest}#拷貝文件扳还,cp -r dir1 dir2 可以遞歸拷貝(目錄)
rm {fn}#刪除文件懒熙,rm -r 遞歸刪除目錄,rm -f 強(qiáng)制刪除
mv {src} {dest}#移動(dòng)文件普办,如果 dest 是目錄工扎,則移動(dòng),是文件名則覆蓋
touch {fn}#創(chuàng)建或者更新一下制定文件
cat {fn}#輸出文件原始內(nèi)容
any_cmd>{fn}#執(zhí)行任意命令并將標(biāo)準(zhǔn)輸出重定向到指定文件
more {fn}#逐屏顯示某文件內(nèi)容衔蹲,空格翻頁(yè)肢娘,q 退出
less {fn}#更高級(jí)點(diǎn)的 more,更多操作舆驶,q 退出
head {fn}#顯示文件頭部數(shù)行橱健,可用 head -3 abc.txt 顯示頭三行
tail {fn}#顯示文件尾部數(shù)行,可用 tail -3 abc.txt 顯示尾部三行
tail -f {fn}#持續(xù)顯示文件尾部數(shù)據(jù)沙廉,可用于監(jiān)控日志
nano {fn}#使用 nano 編輯器編輯文件
vim {fn}#使用 vim 編輯文件
diff {f1} {f2}#比較兩個(gè)文件的內(nèi)容
wc {fn}#統(tǒng)計(jì)文件有多少行拘荡,多少個(gè)單詞
chmod 644 {fn}#修改文件權(quán)限為 644,可以接 -R 對(duì)目錄循環(huán)改權(quán)限
chgrp group {fn}#修改文件所屬的用戶組
chown user1 {fn}#修改文件所有人為 user1, chown user1:group1 fn 可以修改組
file {fn}#檢測(cè)文件的類型和編碼
basename {fn}#查看文件的名字(不包括路徑)
dirname {fn}#查看文件的路徑(不包括名字)
grep {pat} {fn}#在文件中查找出現(xiàn)過 pat 的內(nèi)容
grep -r {pat}.#在當(dāng)前目錄下遞歸查找所有出現(xiàn)過 pat 的文件內(nèi)容
stat {fn}#顯示文件的詳細(xì)信息
##############################################################################
#用戶管理
##############################################################################
whoami#顯示我的用戶名
who#顯示已登陸用戶信息撬陵,w / who / users 內(nèi)容略有不同
w#顯示已登陸用戶信息珊皿,w / who / users 內(nèi)容略有不同
users#顯示已登陸用戶信息,w / who / users 內(nèi)容略有不同
passwd#修改密碼巨税,passwd {user} 可以用于 root 修改別人密碼
finger {user}#顯示某用戶信息蟋定,包括 id, 名字, 登陸狀態(tài)等
adduser {user}#添加用戶
deluser {user}#刪除用戶
w#查看誰在線
su#切換到 root 用戶
su -#切換到 root 用戶并登陸(執(zhí)行登陸腳本)
su {user}#切換到某用戶
su -{user}#切換到某用戶并登陸(執(zhí)行登陸腳本)
id {user}#查看用戶的 uid,gid 以及所屬其他用戶組
id -u {user}#打印用戶 uid
id -g {user}#打印用戶 gid
write {user}#向某用戶發(fā)送一句消息
last#顯示最近用戶登陸列表
last {user}#顯示登陸記錄
lastb#顯示失敗登陸記錄
lastlog#顯示所有用戶的最近登陸記錄
sudo {command}#以 root 權(quán)限執(zhí)行某命令
##############################################################################
#進(jìn)程管理
##############################################################################
ps#查看當(dāng)前會(huì)話進(jìn)程
ps ax#查看所有進(jìn)程草添,類似 ps -e
ps aux#查看所有進(jìn)程詳細(xì)信息驶兜,類似 ps -ef
ps auxww#查看所有進(jìn)程,并且顯示進(jìn)程的完整啟動(dòng)命令
ps -u {user}#查看某用戶進(jìn)程
ps axjf#列出進(jìn)程樹
ps xjf -u {user}#列出某用戶的進(jìn)程樹
ps -eo pid,user,command#按用戶指定的格式查看進(jìn)程
ps aux|grep httpd#查看名為 httpd 的所有進(jìn)程
ps --ppid {pid}#查看父進(jìn)程為 pid 的所有進(jìn)程
pstree#樹形列出所有進(jìn)程远寸,pstree 默認(rèn)一般不帶抄淑,需安裝
pstree {user}#進(jìn)程樹列出某用戶的進(jìn)程
pstree -u#樹形列出所有進(jìn)程以及所屬用戶
pgrep {procname}#搜索名字匹配的進(jìn)程的 pid,比如 pgrep apache2
kill{pid}#結(jié)束進(jìn)程
kill-9 {pid}#強(qiáng)制結(jié)束進(jìn)程驰后,9/SIGKILL 是強(qiáng)制不可捕獲結(jié)束信號(hào)
kill-KILL {pid}#強(qiáng)制執(zhí)行進(jìn)程肆资,kill -9 的另外一種寫法
kill-l#查看所有信號(hào)
kill-l TERM#查看 TERM 信號(hào)的編號(hào)
killall {procname}#按名稱結(jié)束所有進(jìn)程
pkill {procname}#按名稱結(jié)束進(jìn)程,除名稱外還可以有其他參數(shù)
top#查看最活躍的進(jìn)程
top -u {user}#查看某用戶最活躍的進(jìn)程
any_command&#在后臺(tái)運(yùn)行某命令倡怎,也可用 CTRL+Z 將當(dāng)前進(jìn)程掛到后臺(tái)
jobs#查看所有后臺(tái)進(jìn)程(jobs)
bg#查看后臺(tái)進(jìn)程迅耘,并切換過去
fg#切換后臺(tái)進(jìn)程到前臺(tái)
fg{job}#切換特定后臺(tái)進(jìn)程到前臺(tái)
trapcmd sig1 sig2#在腳本中設(shè)置信號(hào)處理命令
trap""sig1 sig2#在腳本中屏蔽某信號(hào)
trap- sig1 sig2#恢復(fù)默認(rèn)信號(hào)處理行為
nohup {command}#長(zhǎng)期運(yùn)行某程序,在你退出登陸都保持它運(yùn)行
nohup {command}&#在后臺(tái)長(zhǎng)期運(yùn)行某程序
disown{PID|JID}#將進(jìn)程從后臺(tái)任務(wù)列表(jobs)移除
wait#等待所有后臺(tái)進(jìn)程任務(wù)結(jié)束
##############################################################################
#常用命令:SSH / 系統(tǒng)信息 / 網(wǎng)絡(luò)
##############################################################################
ssh user@host#以用戶 user 登陸到遠(yuǎn)程主機(jī) host
ssh -p {port} user@host#指定端口登陸主機(jī)
ssh-copy-id user@host#拷貝你的 ssh key 到遠(yuǎn)程主機(jī)监署,避免重復(fù)輸入密碼
scp {fn} user@host:path#拷貝文件到遠(yuǎn)程主機(jī)
scp user@host:path dest#從遠(yuǎn)程主機(jī)拷貝文件回來
scp -P {port} ...#指定端口遠(yuǎn)程拷貝文件
uname -a#查看內(nèi)核版本等信息
man {help}#查看幫助
man -k {keyword}#查看哪些幫助文檔里包含了該關(guān)鍵字
info {help}#查看 info pages颤专,比 man 更強(qiáng)的幫助系統(tǒng)
uptime#查看系統(tǒng)啟動(dòng)時(shí)間
date#顯示日期
cal#顯示日歷
vmstat#顯示內(nèi)存和 CPU 使用情況
vmstat 10#每 10 秒打印一行內(nèi)存和 CPU情況,CTRL+C 退出
free#顯示內(nèi)存和交換區(qū)使用情況
df#顯示磁盤使用情況
du#顯示當(dāng)前目錄占用钠乏,du . --max-depth=2 可以指定深度
uname#顯示系統(tǒng)版本號(hào)
hostname#顯示主機(jī)名稱
showkey -a#查看終端發(fā)送的按鍵編碼
ping {host}#ping 遠(yuǎn)程主機(jī)并顯示結(jié)果栖秕,CTRL+C 退出
ping -c N {host}#ping 遠(yuǎn)程主機(jī) N 次
traceroute {host}#偵測(cè)路由連通情況
mtr {host}#高級(jí)版本 traceroute
host {domain}#DNS 查詢,{domain} 前面可加 -a 查看詳細(xì)信息
whois {domain}#取得域名 whois 信息
dig {domain}#取得域名 dns 信息
route -n#查看路由表
netstat -a#列出所有端口
netstat -an#查看所有連接信息晓避,不解析域名
netstat -anp#查看所有連接信息辈末,包含進(jìn)程信息(需要 sudo)
netstat -l#查看所有監(jiān)聽的端口
netstat -t#查看所有 TCP 鏈接
netstat -lntu#顯示所有正在監(jiān)聽的 TCP 和 UDP 信息
netstat -lntup#顯示所有正在監(jiān)聽的 socket 及進(jìn)程信息
netstat -i#顯示網(wǎng)卡信息
netstat -rn#顯示當(dāng)前系統(tǒng)路由表菲驴,同 route -n
ss -an#比 netstat -an 更快速更詳細(xì)
ss -s#統(tǒng)計(jì) TCP 的 established, wait 等
wget {url}#下載文件,可加 --no-check-certificate 忽略 ssl 驗(yàn)證
wget -qO- {url}#下載文件并輸出到標(biāo)準(zhǔn)輸出(不保存)
curl -sL {url}#同 wget -qO- {url} 沒有 wget 的時(shí)候使用
sz {file}#發(fā)送文件到終端,zmodem 協(xié)議
rz#接收終端發(fā)送過來的文件
##############################################################################
#變量操作
##############################################################################
varname=value#定義變量
varname=valuecommand#定義子進(jìn)程變量并執(zhí)行子進(jìn)程
echo$varname#查看變量?jī)?nèi)容
echo$$#查看當(dāng)前 shell 的進(jìn)程號(hào)
echo$!#查看最近調(diào)用的后臺(tái)任務(wù)進(jìn)程號(hào)
echo$?#查看最近一條命令的返回碼
exportVARNAME=value#設(shè)置環(huán)境變量(將會(huì)影響到子進(jìn)程)
array[0]=valA#定義數(shù)組
array[1]=valB
array[2]=valC
array=([0]=valA [1]=valB [2]=valC)#另一種方式
array=(valA valB valC)#另一種方式
${array[i]}#取得數(shù)組中的元素
${#array[@]}#取得數(shù)組的長(zhǎng)度
${#array[i]}#取得數(shù)組中某個(gè)變量的長(zhǎng)度
declare-a#查看所有數(shù)組
declare-f#查看所有函數(shù)
declare-F#查看所有函數(shù)诚撵,僅顯示函數(shù)名
declare-i#查看所有整數(shù)
declare-r#查看所有只讀變量
declare-x#查看所有被導(dǎo)出成環(huán)境變量的東西
declare-p varname#輸出變量是怎么定義的(類型+值)
${varname:-word}#如果變量不為空則返回變量,否則返回 word
${varname:=word}#如果變量不為空則返回變量架专,否則賦值成 word 并返回
${varname:?message}#如果變量不為空則返回變量氢卡,否則打印錯(cuò)誤信息并退出
${varname:+word}#如果變量不為空則返回 word,否則返回 null
${varname:offset:len}#取得字符串的子字符串
${variable#pattern}#如果變量頭部匹配 pattern搞隐,則刪除最小匹配部分返回剩下的
${variable##pattern}#如果變量頭部匹配 pattern驹愚,則刪除最大匹配部分返回剩下的
${variable%pattern}#如果變量尾部匹配 pattern,則刪除最小匹配部分返回剩下的
${variable%%pattern}#如果變量尾部匹配 pattern劣纲,則刪除最大匹配部分返回剩下的
${variable/pattern/str}#將變量中第一個(gè)匹配 pattern 的替換成 str逢捺,并返回
${variable//pattern/str}#將變量中所有匹配 pattern 的地方替換成 str 并返回
${#varname}#返回字符串長(zhǎng)度
*(patternlist)#零次或者多次匹配
+(patternlist)#一次或者多次匹配
?(patternlist)#零次或者一次匹配
@(patternlist)#單詞匹配
!(patternlist)#不匹配
array=($text)#按空格分隔 text 成數(shù)組,并賦值給變量
IFS="/"array=($text)#按斜桿分隔字符串 text 成數(shù)組癞季,并賦值給變量
text="${array[*]}"#用空格鏈接數(shù)組并賦值給變量
text=$(IFS=/;echo"${array[*]}")#用斜杠鏈接數(shù)組并賦值給變量
A=( foo bar"a? b c"42 )#數(shù)組定義
B=("${A[@]:1:2}")#數(shù)組切片:B=( bar "a? b c" )
C=("${A[@]:1}")#數(shù)組切片:C=( bar "a? b c" 42 )
echo"${B[@]}"#bar a? b c
echo"${B[1]}"#a? b c
echo"${C[@]}"#bar a? b c 42
echo"${C[@]:-2:2}"#a? b c 42? 減號(hào)前的空格是必須的
$(UNIX command)#運(yùn)行命令劫瞳,并將標(biāo)準(zhǔn)輸出內(nèi)容捕獲并返回
varname=$(id -u user)#將用戶名為 user 的 uid 賦值給 varname 變量
num=$(expr 1 + 2)#兼容 posix sh 的計(jì)算,使用 expr 命令計(jì)算結(jié)果
num=$(expr$num+ 1)#數(shù)字自增
expr 2\*\(2 + 3\)#兼容 posix sh 的復(fù)雜計(jì)算绷柒,輸出 10
num=$((1+2))#計(jì)算 1+2 賦值給 num柠新,使用 bash 獨(dú)有的 $((..)) 計(jì)算
num=$(($num+1))#變量遞增
num=$((num+1))#變量遞增,雙括號(hào)內(nèi)的 $ 可以省略
num=$((1+(2+3)*2))#復(fù)雜計(jì)算
##############################################################################
#事件指示符
##############################################################################
!!#上一條命令
!^#上一條命令的第一個(gè)單詞
!$#上一條命令的最后一個(gè)單詞
!string#最近一條包含string的命令
!^string1^string2#最近一條包含string1的命令, 快速替換為string2, 相當(dāng)于!!:s/string1/string2/
!## 本條命令之前所有的輸入內(nèi)容
##############################################################################
#函數(shù)
##############################################################################
#定義一個(gè)新函數(shù)
functionmyfunc(){
#$1 代表第一個(gè)參數(shù)辉巡,$N 代表第 N 個(gè)參數(shù)
#$# 代表參數(shù)個(gè)數(shù)
#$0 代表被調(diào)用者自身的名字
#$@ 代表所有參數(shù)恨憎,類型是個(gè)數(shù)組,想傳遞所有參數(shù)給其他命令用 cmd "$@"
#$* 空格鏈接起來的所有參數(shù)郊楣,類型是字符串
? ? {shell commands ...}
}
myfunc#調(diào)用函數(shù) myfunc
myfunc arg1 arg2 arg3#帶參數(shù)的函數(shù)調(diào)用
myfunc"$@"#將所有參數(shù)傳遞給函數(shù)
myfunc"${array[@]}"#將一個(gè)數(shù)組當(dāng)作多個(gè)參數(shù)傳遞給函數(shù)
shift#參數(shù)左移
unset-f myfunc#刪除函數(shù)
declare-f#列出函數(shù)定義
##############################################################################
#條件判斷(兼容 posix sh 的條件判斷):man test
##############################################################################
statement1&&statement2#and 操作符
statement1||statement2#or 操作符
exp1 -a exp2#exp1 和 exp2 同時(shí)為真時(shí)返回真(POSIX XSI擴(kuò)展)
exp1 -o exp2#exp1 和 exp2 有一個(gè)為真就返回真(POSIX XSI擴(kuò)展)
( expression )#如果 expression 為真時(shí)返回真憔恳,輸入注意括號(hào)前反斜桿
!expression#如果 expression 為假那返回真
str1 = str2#判斷字符串相等,如 [ "$x" = "$y" ] && echo yes
str1!= str2#判斷字符串不等净蚤,如 [ "$x" != "$y" ] && echo yes
str1<str2#字符串小于钥组,如 [ "$x" \< "$y" ] && echo yes
str2>str2#字符串大于,注意 < 或 > 是字面量今瀑,輸入時(shí)要加反斜桿
-n str1#判斷字符串不為空(長(zhǎng)度大于零)
-z str1#判斷字符串為空(長(zhǎng)度等于零)
-a file#判斷文件存在程梦,如 [ -a /tmp/abc ] && echo "exists"
-d file#判斷文件存在点把,且該文件是一個(gè)目錄
-e file#判斷文件存在,和 -a 等價(jià)
-f file#判斷文件存在屿附,且該文件是一個(gè)普通文件(非目錄等)
-r file#判斷文件存在郎逃,且可讀
-s file#判斷文件存在,且尺寸大于0
-w file#判斷文件存在挺份,且可寫
-x file#判斷文件存在褒翰,且執(zhí)行
-N file#文件上次修改過后還沒有讀取過
-O file#文件存在且屬于當(dāng)前用戶
-G file#文件存在且匹配你的用戶組
file1 -nt file2#文件1 比 文件2 新
file1 -ot file2#文件1 比 文件2 舊
num1 -eq num2#數(shù)字判斷:num1 == num2
num1 -ne num2#數(shù)字判斷:num1 != num2
num1 -lt num2#數(shù)字判斷:num1 < num2
num1 -le num2#數(shù)字判斷:num1 <= num2
num1 -gt num2#數(shù)字判斷:num1 > num2
num1 -ge num2#數(shù)字判斷:num1 >= num2
##############################################################################
#分支控制:if 和經(jīng)典 test,兼容 posix sh 的條件判斷語(yǔ)句
##############################################################################
test{expression}#判斷條件為真的話 test 程序返回0 否則非零
[ expression ]#判斷條件為真的話返回0 否則非零
test"abc"="def"#查看返回值 echo $? 顯示 1匀泊,因?yàn)闂l件為假
test"abc"!="def"#查看返回值 echo $? 顯示 0优训,因?yàn)闂l件為真
test-a /tmp;echo$?#調(diào)用 test 判斷 /tmp 是否存在,并打印 test 的返回值
[-a/tmp ];echo$?#和上面完全等價(jià)各聘,/tmp 肯定是存在的揣非,所以輸出是 0
testcond&&cmd1#判斷條件為真時(shí)執(zhí)行 cmd1
[ cond ]&&cmd1#和上面完全等價(jià)
[ cond ]&&cmd1||cmd2#條件為真執(zhí)行 cmd1 否則執(zhí)行 cmd2
#判斷 /etc/passwd 文件是否存在
#經(jīng)典的 if 語(yǔ)句就是判斷后面的命令返回值為0的話,認(rèn)為條件為真躲因,否則為假
iftest-e /etc/passwd;then
echo"alright it exists ..."
else
echo"it doesn't exist ..."
fi
#和上面完全等價(jià)妆兑,[ 是個(gè)和 test 一樣的可執(zhí)行程序,但最后一個(gè)參數(shù)必須為 ]
#這個(gè)名字為 "[" 的可執(zhí)行程序一般就在 /bin 或 /usr/bin 下面毛仪,比 test 優(yōu)雅些
if[-e/etc/passwd ];then
echo"alright it exists ..."
else
echo"it doesn't exist ..."
fi
#和上面兩個(gè)完全等價(jià)搁嗓,其實(shí)到 bash 時(shí)代 [ 已經(jīng)是內(nèi)部命令了,用 enable 可以看到
[-e/etc/passwd ]&&echo"alright it exists"||echo"it doesn't exist"
#判斷變量的值
if["$varname"="foo"];then
echo"this is foo"
elif["$varname"="bar"];then
echo"this is bar"
else
echo"neither"
fi
#復(fù)雜條件判斷箱靴,注意 || 和 && 是完全兼容 POSIX 的推薦寫法
if[$x-gt10 ]&&[$x-lt20 ];then
echo"yes, between 10 and 20"
fi
#可以用 && 命令連接符來做和上面完全等價(jià)的事情
[$x-gt10 ]&&[$x-lt20 ]&&echo"yes, between 10 and 20"
#小括號(hào)和 -a -o 是 POSIX XSI 擴(kuò)展寫法腺逛,小括號(hào)是字面量,輸入時(shí)前面要加反斜桿
if[\($x-gt10\)-a\($x-lt20\)];then
echo"yes, between 10 and 20"
fi
#同樣可以用 && 命令連接符來做和上面完全等價(jià)的事情
[\($x-gt10\)-a\($x-lt20\)]&&echo"yes, between 10 and 20"
#判斷程序存在的話就執(zhí)行
[-x/bin/ls ]&&/bin/ls -l
#如果不考慮兼容 posix sh 和 dash 這些的話衡怀,可用 bash 獨(dú)有的 ((..)) 和 [[..]]:
https://www.ibm.com/developerworks/library/l-bash-test/index.html
##############################################################################
#流程控制:while / for / case / until
##############################################################################
#while 循環(huán)
whilecondition;do
? ? statements
done
i=1
while[$i-le10 ];do
echo$i;
i=$(expr$i+ 1)
done
#for 循環(huán):上面的 while 語(yǔ)句等價(jià)
foriin{1..10};do
echo$i
done
forname [in list];do
? ? statements
done
#for 列舉某目錄下面的所有文件
forfin/home/*;do
echo$f
done
#bash 獨(dú)有的 (( .. )) 語(yǔ)句棍矛,更接近 C 語(yǔ)言,但是不兼容 posix sh
for((initialisation ; ending condition ; update));do
? ? statements
done
#和上面的寫法等價(jià)
for((i=0; i<10; i++));doecho$i;done
#case 判斷
caseexpressionin
? ? pattern1 )
? ? ? ? statements ;;
? ? pattern2 )
? ? ? ? statements ;;
*)
? ? ? ? otherwise ;;
esac
#until 語(yǔ)句
untilcondition;do
? ? statements
done
#select 語(yǔ)句
selectname[in list];do
statements that can use$name
done
##############################################################################
#命令處理
##############################################################################
commandls#忽略 alias 直接執(zhí)行程序或者內(nèi)建命令 ls
builtincd#忽略 alias 直接運(yùn)行內(nèi)建的 cd 命令
enable#列出所有 bash 內(nèi)置命令抛杨,或禁止某命令
help{builtin_command}#查看內(nèi)置命令的幫助(僅限 bash 內(nèi)置命令)
eval$script#對(duì) script 變量中的字符串求值(執(zhí)行)
##############################################################################
#輸出/輸入 重定向
##############################################################################
cmd1|cmd2#管道够委,cmd1 的標(biāo)準(zhǔn)輸出接到 cmd2 的標(biāo)準(zhǔn)輸入
<file#將文件內(nèi)容重定向?yàn)槊畹臉?biāo)準(zhǔn)輸入
>file#將命令的標(biāo)準(zhǔn)輸出重定向到文件,會(huì)覆蓋文件
>>file#將命令的標(biāo)準(zhǔn)輸出重定向到文件怖现,追加不覆蓋
>|file#強(qiáng)制輸出到文件茁帽,即便設(shè)置過:set -o noclobber
n>|file#強(qiáng)制將文件描述符 n的輸出重定向到文件
<>file#同時(shí)使用該文件作為標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出
n<>file#同時(shí)使用文件作為文件描述符 n 的輸出和輸入
n>file#重定向文件描述符 n 的輸出到文件
n<file#重定向文件描述符 n 的輸入為文件內(nèi)容
n>&#將標(biāo)準(zhǔn)輸出 dup/合并 到文件描述符 n
n<&#將標(biāo)準(zhǔn)輸入 dump/合并 定向?yàn)槊枋龇?n
n>&m#文件描述符 n 被作為描述符 m 的副本屈嗤,輸出用
n<&m#文件描述符 n 被作為描述符 m 的副本,輸入用
&>file#將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤重定向到文件
<&-#關(guān)閉標(biāo)準(zhǔn)輸入
>&-#關(guān)閉標(biāo)準(zhǔn)輸出
n>&-#關(guān)閉作為輸出的文件描述符 n
n<&-#關(guān)閉作為輸入的文件描述符 n
diff<(cmd1)<(cmd2)#比較兩個(gè)命令的輸出
##############################################################################
#文本處理 - cut
##############################################################################
cut -c 1-16#截取每行頭16個(gè)字符
cut -c 1-16 file#截取指定文件中每行頭 16個(gè)字符
cut -c3-#截取每行從第三個(gè)字符開始到行末的內(nèi)容
cut -d':'-f5#截取用冒號(hào)分隔的第五列內(nèi)容
cut -d';'-f2,10#截取用分號(hào)分隔的第二和第十列內(nèi)容
cut -d''-f3-7#截取空格分隔的三到七列
echo"hello"|cut -c1-3#顯示 hel
echo"hello sir"|cut -d''-f2#顯示 sir
ps|tr -s""|cut -d""-f 2,3,4#cut 搭配 tr 壓縮字符
##############################################################################
#文本處理 - awk / sed
##############################################################################
awk'{print $5}'file#打印文件中以空格分隔的第五列
awk -F',''{print $5}'file#打印文件中以逗號(hào)分隔的第五列
awk'/str/ {print $2}'file#打印文件中包含 str 的所有行的第二列
awk -F',''{print $NF}'file#打印逗號(hào)分隔的文件中的每行最后一列
awk'{s+=$1} END {print s}'file#計(jì)算所有第一列的合
awk'NR%3==1'file#從第一行開始扭屁,每隔三行打印一行
sed's/find/replace/'file#替換文件中首次出現(xiàn)的字符串并輸出結(jié)果
sed'10s/find/replace/'file#替換文件第 10 行內(nèi)容
sed'10,20s/find/replace/'file#替換文件中 10-20 行內(nèi)容
sed -r's/regex/replace/g'file#替換文件中所有出現(xiàn)的字符串
sed -i's/find/replace/g'file#替換文件中所有出現(xiàn)的字符并且覆蓋文件
sed -i'/find/i\newline'file#在文件的匹配文本前插入行
sed -i'/find/a\newline'file#在文件的匹配文本后插入行
sed'/line/s/find/replace/'file#先搜索行特征再執(zhí)行替換
sed -e's/f/r/'-e's/f/r'file#執(zhí)行多次替換
sed's#find#replace#'file#使用 # 替換 / 來避免 pattern 中有斜桿
sed -i -r's/^\s+//g'file#刪除文件每行頭部空格
sed'/^$/d'file#刪除文件空行并打印
sed -i's/\s\+$//'file#刪除文件每行末尾多余空格
sed -n'2p'file#打印文件第二行
sed -n'2,5p'file#打印文件第二到第五行
##############################################################################
#排序 - sort
##############################################################################
sort file#排序文件
sort -r file#反向排序(降序)
sort -n file#使用數(shù)字而不是字符串進(jìn)行比較
sort -t: -k 3n /etc/passwd#按 passwd 文件的第三列進(jìn)行排序
sort -u file#去重排序
##############################################################################
#快速跳轉(zhuǎn) - https://github.com/rupa/z
##############################################################################
source/path/to/z.sh#.bashrc 中初始化 z.sh
z#列出所有歷史路徑以及他們的權(quán)重
z foo#跳到歷史路徑中匹配 foo 的權(quán)重最大的目錄
z foo bar#跳到歷史路徑中匹配 foo 和 bar 權(quán)重最大的目錄
z -l foo#列出所有歷史路徑中匹配 foo 的目錄及權(quán)重
z -r foo#按照最高訪問次數(shù)優(yōu)先進(jìn)行匹配跳轉(zhuǎn)
z -t foo#按照最近訪問優(yōu)先進(jìn)行匹配跳轉(zhuǎn)
##############################################################################
#鍵盤綁定
##############################################################################
bind'"\eh":"\C-b"'#綁定 ALT+h 為光標(biāo)左移,同 CTRL+b /
bind'"\el":"\C-f"'#綁定 ALT+l 為光標(biāo)右移涩禀,同 CTRL+f /
bind'"\ej":"\C-n"'#綁定 ALT+j 為下條歷史料滥,同 CTRL+n /
bind'"\ek":"\C-p"'#綁定 ALT+k 為上條歷史,同 CTRL+p /
bind'"\eH":"\eb"'#綁定 ALT+H 為光標(biāo)左移一個(gè)單詞埋泵,同 ALT-b
bind'"\eL":"\ef"'#綁定 ALT+L 為光標(biāo)右移一個(gè)單詞幔欧,同 ALT-f
bind'"\eJ":"\C-a"'#綁定 ALT+J 為移動(dòng)到行首罪治,同 CTRL+a /
bind'"\eK":"\C-e"'#綁定 ALT+K 為移動(dòng)到行末丽声,同 CTRL+e /
bind'"\e;":"ls -l\n"'#綁定 ALT+; 為執(zhí)行 ls -l 命令
##############################################################################
#網(wǎng)絡(luò)管理:ip / ifconfig / nmap ...
##############################################################################
ip a#顯示所有網(wǎng)絡(luò)地址,同 ip address
ip a show eth1#顯示網(wǎng)卡 IP 地址
ip a add 172.16.1.23/24 dev eth1#添加網(wǎng)卡 IP 地址
ip a del 172.16.1.23/24 dev eth1#刪除網(wǎng)卡 IP 地址
ip link show dev eth0#顯示網(wǎng)卡設(shè)備屬性
ip linkseteth1 up#激活網(wǎng)卡
ip linkseteth1 down#關(guān)閉網(wǎng)卡
ip linkseteth1 address {mac}#修改 MAC 地址
ip neighbour#查看 ARP 緩存
ip route#查看路由表
ip route add 10.1.0.0/24 via 10.0.0.253 dev eth0#添加靜態(tài)路由
ip route del 10.1.0.0/24#刪除靜態(tài)路由
ifconfig#顯示所有網(wǎng)卡和接口信息
ifconfig -a#顯示所有網(wǎng)卡(包括開機(jī)沒啟動(dòng)的)信息
ifconfig eth0#指定設(shè)備顯示信息
ifconfig eth0 up#激活網(wǎng)卡
ifconfig eth0 down#關(guān)閉網(wǎng)卡
ifconfig eth0 192.168.120.56#給網(wǎng)卡配置 IP 地址
ifconfig eth0 10.0.0.8 netmask 255.255.255.0 up#配置 IP 并啟動(dòng)
ifconfig eth0 hw ether 00:aa:bb:cc:dd:ee#修改 MAC 地址
nmap 10.0.0.12#掃描主機(jī) 1-1000 端口
nmap -p 1024-65535 10.0.0.12#掃描給定端口
nmap 10.0.0.0/24#給定網(wǎng)段掃描局域網(wǎng)內(nèi)所有主機(jī)
nmap -O -sV 10.0.0.12#探測(cè)主機(jī)服務(wù)和操作系統(tǒng)版本
##############################################################################
#有趣的命令
##############################################################################
man hier#查看文件系統(tǒng)的結(jié)構(gòu)和含義
mantest#查看 posix sh 的條件判斷幫助
man ascii#顯示 ascii 表
getconf LONG_BIT#查看系統(tǒng)是 32 位還是 64 位
bind-P#列出所有 bash 的快捷鍵
mount|column -t#漂亮的列出當(dāng)前加載的文件系統(tǒng)
curl ip.cn#取得外網(wǎng) ip 地址和服務(wù)商信息
disown-a&&exit#關(guān)閉所有后臺(tái)任務(wù)并退出
cat /etc/issue#查看 Linux 發(fā)行版信息
lsof -i port:80#哪個(gè)程序在使用 80 端口觉义?
showkey -a#取得按鍵的 ASCII 碼
svn diff|view -#使用 Vim 來顯示帶色彩的 diff 輸出
mv filename.{old,new}#快速文件改名
timeread#使用 CTRL-D 停止雁社,最簡(jiǎn)單的計(jì)時(shí)功能
cp file.txt{,.bak}#快速備份文件
sudo touch /forcefsck#強(qiáng)制在下次重啟時(shí)掃描磁盤
find~-mmin 60 -type f#查找 $HOME 目錄中,60 分鐘內(nèi)修改過的文件
curl wttr.in/~beijing#查看北京的天氣預(yù)報(bào)
echo${SSH_CLIENT%%*}#取得你是從什么 IP 鏈接到當(dāng)前主機(jī)上的
echo$[RANDOM%X+1]#取得 1 到 X 之間的隨機(jī)數(shù)
bind-x'"\C-l":ls -l'#設(shè)置 CTRL+l 為執(zhí)行 ls -l 命令
find / -type f -size +5M#查找大于 5M 的文件
chmod --reference f1 f2#將 f2 的權(quán)限設(shè)置成 f1 一模一樣的
curl -L cheat.sh#速查表大全
##############################################################################
#常用技巧
##############################################################################
#列出最常使用的命令
history|awk'{a[$2]++}END{for(i in a){print a[i] " " i}}'|sort -rn|head
#列出所有網(wǎng)絡(luò)狀態(tài):ESTABLISHED / TIME_WAIT / FIN_WAIT1 / FIN_WAIT2
netstat -n|awk'/^tcp/ {++tt[$NF]} END {for (a in tt) print a, tt[a]}'
#通過 SSH 來 mount 文件系統(tǒng)
sshfs name@server:/path/to/folder /path/to/mount/point
#顯示前十個(gè)運(yùn)行的進(jìn)程并按內(nèi)存使用量排序
ps aux|sort -nk +4|tail
#在右上角顯示時(shí)鐘
whilesleep 1;dotput sc;tput cup 0$(($(tput cols)-29));date;tput rc;done&
#從網(wǎng)絡(luò)上的壓縮文件中解出一個(gè)文件來晒骇,并避免保存中間文件
wget -qO -"http://www.tarball.com/tarball.gz"|tar zxvf -
#性能測(cè)試:測(cè)試處理器性能
python -c"import test.pystone;print(test.pystone.pystones())"
#性能測(cè)試:測(cè)試內(nèi)存帶寬
dd if=/dev/zero of=/dev/null bs=1M count=32768
#Linux 下掛載一個(gè) iso 文件
mount /path/to/file.iso /mnt/cdrom -oloop
#通過主機(jī) A 直接 ssh 到主機(jī) B
ssh -t hostA ssh hostB
#下載一個(gè)網(wǎng)站的所有圖片
wget -r -l1 --no-parent -nH -nd -P/tmp -A".gif,.jpg"http://example.com/images
#快速創(chuàng)建項(xiàng)目目錄
mkdir -p work/{project1,project2}/{src,bin,bak}
#按日期范圍查找文件
find.-type f -newermt"2010-01-01"!-newermt"2010-06-01"
#顯示當(dāng)前正在使用網(wǎng)絡(luò)的進(jìn)程
lsof -P -i -n|cut -f 1 -d""|uniq|tail -n +2
#Vim 中保存一個(gè)沒有權(quán)限的文件
:w!sudo tee>/dev/null %
#在 .bashrc / .bash_profile 中加載另外一個(gè)文件(比如你保存在 github 上的配置)
source~/github/profiles/my_bash_init.sh
#反向代理:將外網(wǎng)主機(jī)(202.115.8.1)端口(8443)轉(zhuǎn)發(fā)到內(nèi)網(wǎng)主機(jī) 192.168.1.2:443
ssh -CqTnN -R 0.0.0.0:8443:192.168.1.2:443? user@202.115.8.1
#正向代理:將本地主機(jī)的 8443 端口霉撵,通過 192.168.1.3 轉(zhuǎn)發(fā)到 192.168.1.2:443
ssh -CqTnN -L 0.0.0.0:8443:192.168.1.2:443? user@192.168.1.3
#socks5 代理:把本地 1080 端口的 socks5 的代理請(qǐng)求通過遠(yuǎn)程主機(jī)轉(zhuǎn)發(fā)出去
ssh -CqTnN -D localhost:1080? user@202.115.8.1
#終端下正確設(shè)置 ALT 鍵和 BackSpace 鍵
http://www.skywind.me/blog/archives/2021
##############################################################################
#有用的函數(shù)
##############################################################################
#自動(dòng)解壓:判斷文件后綴名并調(diào)用相應(yīng)解壓命令
functionq-extract(){
if[-f$1];then
case$1in
*.tar.bz2)? tar -xvjf$1;;
*.tar.gz)? ? tar -xvzf$1;;
*.tar.xz)? ? tar -xvJf$1;;
*.bz2)? ? ? bunzip2$1;;
*.rar)? ? ? rar x$1;;
*.gz)? ? ? ? gunzip$1;;
*.tar)? ? ? tar -xvf$1;;
*.tbz2)? ? ? tar -xvjf$1;;
*.tgz)? ? ? tar -xvzf$1;;
*.zip)? ? ? unzip$1;;
*.Z)? ? ? ? uncompress$1;;
*.7z)? ? ? ? 7z x$1;;
*)echo"don't know how to extract '$1'...";;
esac
else
echo"'$1' is not a valid file!"
fi
}
#自動(dòng)壓縮:判斷后綴名并調(diào)用相應(yīng)壓縮程序
functionq-compress(){
if[-n"$1"];then
FILE=$1
case$FILEin
*.tar)shift&&tar -cf$FILE$*;;
*.tar.bz2)shift&&tar -cjf$FILE$*;;
*.tar.xz)shift&&tar -cJf$FILE$*;;
*.tar.gz)shift&&tar -czf$FILE$*;;
*.tgz)shift&&tar -czf$FILE$*;;
*.zip)shift&&zip$FILE$*;;
*.rar)shift&&rar$FILE$*;;
esac
else
echo"usage: q-compress ./foo ./bar"
fi
}
#漂亮的帶語(yǔ)法高亮的 color cat ,需要先 pip install pygments
functionccat(){
localstyle="monokai"
if[$#-eq0 ];then
pygmentize -P style=$style-P tabsize=4 -f terminal256 -g
else
forNAMEin$@;do
pygmentize -P style=$style-P tabsize=4 -f terminal256 -g"$NAME"
done
fi
}
##############################################################################
#好玩的配置
##############################################################################
#放到你的 ~/.bashrc 配置文件中洪囤,給 man 增加漂亮的色彩高亮
exportLESS_TERMCAP_mb=$'\E[1m\E[32m'
exportLESS_TERMCAP_mh=$'\E[2m'
exportLESS_TERMCAP_mr=$'\E[7m'
exportLESS_TERMCAP_md=$'\E[1m\E[36m'
exportLESS_TERMCAP_ZW=""
exportLESS_TERMCAP_us=$'\E[4m\E[1m\E[37m'
exportLESS_TERMCAP_me=$'\E(B\E[m'
exportLESS_TERMCAP_ue=$'\E[24m\E(B\E[m'
exportLESS_TERMCAP_ZO=""
exportLESS_TERMCAP_ZN=""
exportLESS_TERMCAP_se=$'\E[27m\E(B\E[m'
exportLESS_TERMCAP_ZV=""
exportLESS_TERMCAP_so=$'\E[1m\E[33m\E[44m'
#ALT+hjkl/HJKL 快速移動(dòng)光標(biāo)徒坡,將下面內(nèi)容添加到 ~/.inputrc 中可作用所有工具,
#包括 bash/zsh/python/lua 等使用 readline 的工具瘤缩,幫助見:info rluserman
"\eh": backward-char
"\el": forward-char
"\ej": next-history
"\ek": previous-history
"\eH": backward-word
"\eL": forward-word
"\eJ": beginning-of-line
"\eK": end-of-line
##############################################################################
#References
##############################################################################
https://github.com/Idnan/bash-guide
http://www.linuxstall.com/linux-command-line-tips-that-every-linux-user-should-know/
https://ss64.com/bash/syntax-keyboard.html
http://wiki.bash-hackers.org/commands/classictest
https://www.ibm.com/developerworks/library/l-bash-test/index.html
https://www.cyberciti.biz/faq/bash-loop-over-file/
https://linuxconfig.org/bash-scripting-tutorial
https://github.com/LeCoupa/awesome-cheatsheets/blob/master/languages/bash.sh
https://devhints.io/bash
https://github.com/jlevy/the-art-of-command-line
https://yq.aliyun.com/articles/68541
#vim: set ts=4 sw=4 tw=0 et :