shell脚本:
使用变量的时候(例如变量名为para),$para和${para}是一样的,{}是可选的
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sed追加字符,例如我要把efg加到abcd后面
sed -i 's/abcd/&efg/' filename // &加要追加的字符,就是在后面追加。要追加的字符加&,就是向前追加,如果带双引号的话要用\" 这样的转移字符
如果不加&就是替换,sed -i 's/abcd/efg/' filename 就是把abcd替换成efg了
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
set -e 如果语句执行出错,就退出
set -x 对于要执行的语句,把语句打印出来
组合起来 set -ex 一般放在脚本开头
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
如果linux执行shell脚本的时候报错invalid option 3: set: - 这种错误的话,可能是在windows下编辑过脚本文件导致的
解决办法:sed -i "s/\r//" filename
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
shell脚本里取参数:
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
例如 :
1、export VERSION=$1 就是把第一个参数赋值给VERSION变量
2、判断参数个数:
if [ $# -eq 0 ]; then
echo "没有参数"
fi
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
shell中$@ 可以获取用户传进来的所有参数信息,也可以作为数组使用
使用${数组名:起始索引:长度}可以将数组分片
EXEC_PARAMS=(${@:2}) 能把传入shell的参数的第二个及以后的参数都赋给EXEC_PARAMS
echo "${@: $#-1:1}" 能打印倒数第二个参数,这里$#作为最后一个参数的下标了
echo "${@: $#:1}" 能打印倒数第1个参数,这里$#作为最后一个参数的下标了
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
UNIX Shell 里面比较字符写法:
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
= 两个字符相等
!= 两个字符不等
-n 非空串
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
linux遍历数组: https://blog.youkuaiyun.com/jingwen3699/article/details/82114603
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
shell脚本里判断某变量是否存在: if [ -z ${变量} ] 如果变量长度为空的话,满足if条件
获取shell脚本所在的路径: DIR="$( cd "$( dirname "$0" )" && pwd )"
同理:if [ -n ${变量} ] 如果变量长度不为空的话,满足if条件
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
linux设置环境变量
export PARA="aaa" 记得等号两边不能有
export设置的环境变量只在当前shell及其子shell才生效
find使用格式
find / -name *partFileName*
软连接
ln -s 【目标目录】 【软链接地址】
【软链接地址】需要是新建的,不能是已存在的
ssh 用户名@ip
scp 本地文件名(必须是二进制,不能是文件夹) 远端用户名@ip:目标路径
例如:scp pressure_test.zip vmallservice@10.51.30.151:/home/tomcat/hyz
& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &
&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2'
| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l
|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"
linux的if判断 (注意符号前后的空格)
if [[ a == 1 ]] || [[ a == 2 ]] then;
#do smoething
fi
if [[ a == 1 ]] then;
#do smoething
fi
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
iptables:
Netfileter/iptables (简称iptables)是nuix/linux 系统自带的优秀且完全免费的基于包过滤的防火墙工具、它的功能十分强大、使用非常灵活、可以对流入、流出及流经服务器的数据包进行精细的控制。大概是设定一组访问策略,根据策略把请求的数据包丢弃或者接受。在ips遇到过应用服务器连不上数据库的问题,后来定位是没在数据库服务器的iptables添加允许应用服务器的ip访问的策略,这里的策略我猜是一个白名单策略。至于包不包含黑名单策略,就没细研究
ping、telnet、curl
ping是测试主机之间的网络连通性,是使用ICMP协议的,ICMP是不用端口号的。这个协议是当收到一个别的服务器发来的数据包后再返回给对方一个,就好像声纳,这个协议是可以禁用的,禁用完收到数据包也不返回,这样显示无法ping通,但是实际上网络是通的
telnet可以测试是否能访问目标服务器的端口。使用telnet协议,telnet协议是TCP/IP协议族的一员,是需要端口号的。使用方式是telnet 域名/IP 端口号。也可以使用telnet来远程登录目标服务器
curl是一个利用URL规则在命令行下工作的文件传输工具,可以用来判断自己的服务器S1是否可以访问其他的服务器S2的具体的服务。使用http协议,它很好地模拟了http的行为
使用方式之一: curl 接口(带协议,带域名,带服务文根)
如果需要通过代理访问,那么格式为:curl url --proxy ip:port
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
linux三剑客之AWK
awk是对文本按行做处理的命令,通常用来按指定规则对信息做抽取
awk [参数] '{操作 参数}' 文件名
{}里面其实是一串符合awk语法规则的语言
例如有一个文件 /etc/passwd 内容是:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
那么执行 awk '{print $0}' /etc/passwd/
结果是把文件内容全打印出来:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
关于awk操作的详解: