变量、条件、循环、函数、数组、sed、awk
function - -> 函数
语法格式:
// 函数名
function_name (){
// 函数体,在函数中执行的命令行
commands…
// 参数返回,return语句可选的
// 如果使用return语句,后面跟的值0-255;
// 如果未使用,则以函数的最后一条命令的运行结果作为返回值。
return int:
}
function name {
commands...
}
内函数中传递参数:
位置变量:
$0 :表示当前脚本的文件名
$# :表示多少个参数
$@ :表示所有的位置参数
$1 :表示第一个参数
$2 :表示第二个参数
pass(){
a=$1
echo $0
echo $#
echo $@
echo $1
echo $2
echo $a
}
调用函数:
pass one two three
执行结果:
pass.sh
3
one two three
one
two
one
局部变量和全局变量:
a=1
// a是全局变量
function a{
b=2
// 这里的b并不是局部变量,而是全局变量
// 如果在函数体内定义局部变量;
local a=2
local b=3
// local 命令将全局变量变为局部变量
echo $b
echo $a
}
a
echo $a
echo $b // 结果为空,因为b是在函数体内定义的
系统变量: $FUNCNAME : 表示当前函数的名称
a(){
echo $FUNCNAME
}
b(){
echo $FUNCNAME
a
}
b
// 执行b函数的过程:
b(){
echo $FUNCNAME
a(){
echo $FUNCNAME
}
a
}
b
return:
// 如果使用return语句,后面跟的值0-255;
// 如果未使用,则以函数的最后一条命令的运行结果作为返回值。
检查一下某个进程是否存在?
checkpid(){
local i
// 定义了局部变量
for i in $*
do
[ -d “/proc/$i” ] && return 0
done
return 1
}
// 进程存在返回0 不存在返回1
checkpid $pid1 $pid2
if [ $? 0 ];then
echo “is running”
else
echo “not running”
fi
/proc 目录 :虚拟目录,系统内存的映射
屏蔽主机的ping命令:
# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
函数调用的几种特殊情况:
$$ :shell本身的PID,就是脚本运行的当前进程的ID号
$! :后台运行的最后一个进程的进程ID号
1.函数体中调用其他函数
2.将函数放入后台
3.递归调用函数,函数体内调用自己
fork炸弹:
.(){.|.&};.
:(){:|:&};:
.(){
.|.&
}
.
awk:
提取本机网卡流量
积分区的剩余流量
语法结构:
awk 选项 ‘[条件]{指令]’ 文件
// 如果编辑多条指令,用;分割
cat tset.txt
hello the world
welcome to china
指令:print
// awk过滤文件的第2列
# awk ‘{print $2}’ test.txt
//输出磁盘的剩余空间
# df -h | awk ‘{print $4}’
注意:若未指定分隔符,默认将空格、制表符作为分隔符
不光可以打印变量,还可以打印常量
选项:-f 可以指定分隔符
//输出/etc/passwd 中以:为分隔符的第一例和第七列
# awk -F:‘{print $1,$7}’ /etc/passwd
root /bin/bash
bin /sbin/nologin
awk内置变量:
$1 文本的第1列
$2 文本的第2列
…
以此类推
NR 文件当前行的行号
NF 文件当前的列数
提取网卡流量:
# ifconfig
PX packets … // 接收到数据量
TX packets … // 发送的数据量
# ifconfig etho | awk ‘/TX p/{print $5}’
2439674050
# df -h / | awk ‘/\//{print $4}’
44G
# df -h / |tail -1 | awk ‘{print $4}’
44G
# awk ‘/Failed/{print $11}’ /var/log/secure