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
不等于
== !=
>
覆盖方式写入
>>
追加方式写入
&
追加此符号可使程序后台运行
fg
调出后台程序(T挂起状态)
1: 正确输出信息
2: 错误输出信息
eg:
bash file.sh 2>> log.log 1>> log.log
# 类同
bash file.sh >> log.log 2>&1
标准输入:CPU,MEM, 键盘,扫描仪,文件
标准输出:显示器
错误输出:终端显示文件
/dev/null
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 [ 参数 ] `<匹配条件> [ 动作 ]` [ 文件名 ]
参数:
-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 [ 参数 ] `[ 动作 ]` [ 文件名 ]
参数:
-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 [路径][参数] [关键字]
参数详解
-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 [条件1]
then
指令1
elif [条件2]
指令2
else
指令3
fi
case 变量名 in
# 变量名可以使用$1等传参方式
值1)
指令1
;;
值2)
指令2
;;
值3)
指令3
;;
*)
# 条件*代表任意或者没有,不能放在首位
指令4
;;
esac
for 值 in 列表
do
执行语句
done
例:
#!/bin/bash
# for语句的使用示例
for i in $(ls /root)
do
echo "${i}"
done
while 条件
do
执行语句
done
例:
#!/bin/bash
# while的示例
a=1
while [ "${a}" -lt 5 ]
do
echo "${a}"
a=$((a+1))
done
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 python.tar.gz [email protected]:/root/
远端文件拉取到本地:
scp [email protected]:/root/python.tar.gz ./
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
检查: 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;
}
}
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
将执行的每一条命令和结果反馈