shell:命令解釋器
shell位於操作系統和應用程序之間,解釋對應命令至對應位置
分類:
- 圖形化界面:桌面
- 命令行
編寫與執行
#! /bin/bash
/bin/bash filename.sh
# 不需要有可執行權限,建議文件路徑寫完整
bash /bin/bash script_name 或 /bin/bash /root/script_name
# 腳本需要有可執行權限
/bin/bash script_name 或 ./script_name
# 當前環境下執行
source script_name 或 . script_name
註釋
除第一行外,其他使用#
多行註釋:
:<<!
多行註釋
!
# !可以替換爲@?abc等
變量
- 普通變量:
a = 值
# 值爲整體,無特殊符號a = '值'
# 看到什麼輸出什麼,不解析值範圍可解析內容a = "值"
# 如果值範圍有可解析內容,優先執行
- 命令變量
a = `命令`
a = $(命令)
# 先獲取命令值
- 全局變量
env
顯示全局變量a = 值
# 設置普通變量爲全局變量 export aexport a=值
- 查看和取消
$變量名
"$變量名"
${變量名}
"${變量名}"
# 取消 unset 變量名
- 內置變量
$0
獲取當前執行shell文件名稱$n
(1…9) 獲取命令行參數$#
獲取命令行中參數的總個數$?
獲取上一個指令的返回值(0爲成功,非0爲失敗)
字符串截取
${變量名:起始位置:截取長度}
file = 112lkjlj234234
${file:0:5}
從第一個字符開始,截取5個字符(0可以省略)
${file:0-6:3}
從倒數第6個字符開始,截取之後的3個字符
獲取默認值
${變量名:-默認值}
如果變量有值,則取變量值,沒有則取默認值
${變量名:+默認值}
無論變量是否有值,強制使用默認值
測試語句
條件成立,返回0,不成立,返回1
test 條件表達式
[ 條件表達式 ]
文件表達式
-f
判斷後邊輸入的是否是一個文件[ -f file.sh ]
-d
判斷輸入是否是一個目錄[ -d Desktop ]
-x
判斷輸入是否有執行權限[ -x file.sh ]
數值操作符
-eq
等於 -gt
大於 -lt
小於 -ne
不等於
字符串比較
== !=
計算表達式
- $(( 計算表達式 )) 只能用+-*/和()運算符(包含調用變量),並且只能用於整數運算
- let 計算表達式
重定向符號
>
覆蓋方式寫入
>>
追加方式寫入
後臺展示符號
&
追加此符號可使程序後臺運行
fg
調出後臺程序(T掛起狀態)
全部信息符號 2>&1
1: 正確輸出信息
2: 錯誤輸出信息
eg:
bash file.sh 2>> log.log 1>> log.log
# 類同
bash file.sh >> log.log 2>&1
標準輸入:CPU,MEM, 鍵盤,掃描儀,文件
標準輸出:顯示器
錯誤輸出:終端顯示文件
linux垃圾桶
/dev/null
grep
grep [參數][關鍵字] <文件名>
grep aaa test.txt
參數:
-c
只輸出匹配行的技術
grep -c aaa test.txt
-n
顯示匹配行及行號
grep -n bbb test.txt
-v
顯示不包含匹配文本的所有行
grep -v ccc test.txt
精確定位錯誤代碼
grep -nr [錯誤關鍵字] *
grep -nr error_message
*
代表任意字符
sed(行文件編輯工具)
sed [ 參數 ] `<匹配條件> [ 動作 ]` [ 文件名 ]
參數:
-i
表示對文件進行編輯(參數爲空,表示演示操作,不對實際文件進行操作)(mac 版本中需要在參數後添加任意,例:-i ' '
動作參數:
-a
在匹配到的內容下一行增加內容
-i
在匹配到的內容上一行增加內容
-d
刪除匹配到的內容
-s
替換匹配到的內容
替換命令:
sed -i [ 替換命令 ][ 文件名 ]
替換示例s
:
sed '[ 行號 ]s#原內容#替換內容#[ 列號 ]'
(#
可以更換爲其他特殊字符:!@/
等)(行號省略,代表所有行;列號省略代表第一列(列號g
代表所有列))
增加示例-i
:(選定行的上一行增加)
sed -i '行號i\增加的內容' 文件名
多行範圍(1~2):sed -i '行號1,行號2i\增加的內容' 文件名
增加示例-a
:(選定行的下一行增加)
sed -i '行號a\增加的內容' 文件名
多行範圍(1~3):sed -i '行號1,行號3a\增加的內容' 文件名
刪除示例-d
:
sed -i '行號d' 文件名
多行範圍(1~3):sed -i '行號1,行號3d' 文件名
awk 文檔編輯工具
awk [ 參數 ] `[ 動作 ]` [ 文件名 ]
參數:
-F
指定行分隔符(文本中內容)
動作:
print
顯示內容
$0
顯示當前行內容
$n
顯示當前行的第n列內容,如果存在多個$n,它們之間使用逗號,
隔開
常見內置變量:
FILENAME
當前輸入文件的文件名,該變量是隻讀的
NR
指定顯示行的行號
NF
輸出 最後一列的內容
OFS
輸出格式的列分隔符,缺省是空格
FS
輸入文件的列分融符,缺省是連續的空格和Tab
awk '{print $1, $3}' test.txt
awk '{print $0}' test.txt
打印所有行內容
指定行:
指定隔離分隔符,查看內容
admin-1@ubuntu:~$ awk -F ':' '{print $1,$7}' test.txt
設置顯示分隔符,顯示內容
admin-1@ubuntu:~$ awk 'BEGIN{OFS=":"} {print NR,$0}' awk.txt
1:nihao awk awk awk
2:nihao awk awk awk
find命令
find [路徑][參數] [關鍵字]
參數詳解
-name
按照文件名查找文件。
find /root -name *.py
-perm
按照文件權限來查找文件。
-user
按照文件屬主來查找文件。
-group
按照文件所屬的組來查找文件。
-type
查找某一類型的文件,
find /root/ -type d -name '*.py'
(配合-name使用)
諸如:
b
- 塊設備文件
d
- 目錄
c
- 字符設備文件
p
- 管道文件
l
- 符號鏈接文件
f
- 普通文件。
-size n
:[c] 查找文件長度爲n塊的文件,帶有c時表示文件長度以字節計。
-depth
:在查找文件時,首先查找當前目錄中的文件,然後再在其子目錄中查找。
-mindepth n
:在查找文件時,查找當前目錄中的第n層目錄的文件,然後再在其子目錄中查找。
!
: 表示取反
if語句
if [條件1]
then
指令1
elif [條件2]
指令2
else
指令3
fi
case語句
case 變量名 in
# 變量名可以使用$1等傳參方式
值1)
指令1
;;
值2)
指令2
;;
值3)
指令3
;;
*)
# 條件*代表任意或者沒有,不能放在首位
指令4
;;
esac
for語句
for 值 in 列表
do
執行語句
done
例:
#!/bin/bash
# for語句的使用示例
for i in $(ls /root)
do
echo "${i}"
done
while語句
while 條件
do
執行語句
done
例:
#!/bin/bash
# while的示例
a=1
while [ "${a}" -lt 5 ]
do
echo "${a}"
a=$((a+1))
done
until語句
until 條件
# 只要條件不滿足,就會循環
do
執行語句
done
例:
#!/bin/bash
# until的示例
a=1
until [ "${a}" -eq 5 ]
do
echo "${a}"
a=$((a+1))
done
函數
函數名(){
函數體 $n
}
調用
函數名 參數
代碼發佈
壓縮和解壓
壓縮:tar zcvf file_name
解壓:tar xvf file_name
z
指定壓縮文件的格式爲 tar.gz
c
表示壓縮
v
顯示詳細過程
f
指定壓縮文件
x
解壓
查看壓縮包文件: zcat cfile_name
SCP
本地推送到遠程:
scp python.tar.gz [email protected]:/root/
遠端文件拉取到本地:
scp [email protected]:/root/python.tar.gz ./
SFTP
sftp [email protected]
put file_name
get file_name
備份(使用時間戳)
date [option]
參數:
%F
顯示日期格式: %Y-%m-%d
date +%F
%T
顯示時間格式: %H:%M:%S
date +%T
連續格式(無連接符): date +%Y%m%d
複製備份:cp file_name ./file_name-$(date +%Y%m%d%H%M%S)
移動備份:mv file_name ./file_name-$(date +%Y%m%d%H%M%S)
部署環境
創建基礎目錄
mkdir /data/{server, logs, backup, softs, virtual, scriptes, codes} -p
(服務, 日誌, 備份, 軟件, 虛擬環境, 腳本,代碼)
–
touch {3.. 5}
創建3 ,4, 5連續文件主機網絡環境
主機間免密認證
生成密鑰對:
ssh-keygen -t rsa
密鑰目錄:
/root/.ssh/
私鑰:id_rsa 公鑰id_rsa.pub
編輯認證文件: 將公鑰放置於服務器端
~/.ssh/authorized_keys
配置ssh文件:
/etc/ssh/sshd_config
AuthorizedKeysFile %h/.ssh/authorized_keys
重啓ssh
/etc/init.d/ssh restart
虛擬環境安裝
wget http://www.....
使用python-venv 創建:
python3 -m venv ven_name
激活: cd 至 虛擬環境下bin
source ./activate
nginx
- pcre 關聯軟件安裝
檢查:
nginx/sbin/nginx -t
開啓:
/nginx/sbin/nginx
關閉:
/nginx/sbin/nginx -s strop
重啓:
`/nginx/sbin/nginx -s reload
server{ loaction / { proxy_pass http://127.0.0.1:8000; } }
快速查看端口pid
lsof -Pti :8000
快速殺死端口 kill $(lsof -Pti :8000)
查看端口服務:netstat -tnulp
遠程執行
ssh user_name@ip "執行命令"
鎖文件
if [ -f "${PID_FILE}" ]
then
err_msg
else
main
fi
腳本調試
-n
檢查腳本中語法錯誤
-v
先顯示腳本內容,然後執行腳本,將結果輸出,如果有錯誤,將錯誤輸出
-x
將執行的每一條命令和結果反饋