while, until, for
break: 提前退出循环
continue:提前结束本轮循环,而进入下一轮循环;
1000, SUM>5000
while的特殊用法一:
while :;do
done
while的特殊用法二:
while read LINE; do
done < /PATH/TO/SOMEFILE
/etc/passwd
写一个脚本,完成如下功能:
说明:此脚本能够为指定网卡创建别名,则指定地址;使用格式如:mkethalias.sh -v|--verbose -i ethX
1、-i选项用于指定网卡;指定完成后,要判断其是否存在,如果不存在,就退出;
2、如果用户指定的网卡存在,则让用户为其指定一个别名,此别名可以为空;如果不空,请确保其事先不存在,否则,要报错,并让用户重新输入;
3、在用户输入了一个正确的别名后,请用户输入地址和掩码;并将其配置在指定的别名上;
4、如果用户使用了-v选项,则在配置完成后,显示其配置结果信息;否则,将不显示;
RPM安装:
二进制格式:
源程序-->编译-->二进制格式
有些特性是编译选定的,如果编译未选定此特性,将无法使用;
rpm包的版本会落后于源码包,甚至落后很多;bind-9.8.7, bind-9.7.2
定制:手动编译安装
编译环境,开发环境
开发库,开发工具
Linux: C,
GNU: C
C,C++:
gcc: GNU C Complier, C
g++:
make: 项目管理工具,
makefile:定义了make(gcc,g++)按何种次序去编译这些源程序文件中的源程序
automake, --> makefile.in -->makefile
autoconf, --> configure
100个可选择特性,
make install
编译安装的三步骤:
前提:准备开发环境(编译环境)
安装"Development Tools"和"DevelopmentLibraries"
# tar
# cd
# ./configure
--help
--prefix=/path/to/somewhere
--sysconfdir=/PATH/TO/CONFFILE_PATH
功能:1、让用户选定编译特性;2、检查编译环境;
# make
# make install
# tar xf tengine-1.4.2.tar.gz
# cd tegnine-1.4.2
# ./configure --prefix=/usr/local/tengine--conf-path=/etc/tengine/tengine.conf
# make
# make install
# /usr/local/tengine/sbin/nginx
1、修改PATH环境变量,以能够识别此程序的二进制文件路径;
修改/etc/profile文件
在/etc/profile.d/目录建立一个以.sh为名称后缀的文件,在里面定义export PATH=$PATH:/path/to/somewhere
2、默认情况下,系统搜索库文件的路径/lib,/usr/lib; 要增添额外搜寻路径:
在/etc/ld.so.conf.d/中创建以.conf为后缀名的文件,而后把要增添的路径直接写至此文件中;
#ldconfig 通知系统重新搜寻库文件
-v:显示重新搜寻库的过程
3、头文件:输出给系统
默认:/usr/include
增添头文件搜寻路径,使用链接进行:
/usr/local/tengine/include/ /usr/include/
两种方式:
ln-s /usr/local/tengine/include/* /usr/include/ 或
ln-s /usr/local/tengine/include /usr/include/tengine
4、man文件路径:安装在--prefix指定的目录下的man目录;/usr/share/man
1、man -M/PATH/TO/MAN_DIR COMMAND
2、在/etc/man.config中添加一条MANPATH
netstat命令:
-r:显示路由表
-n:以数字方式显示
-t:建立的tcp连接
-u:显示udp连接
-l:显示监听状态的连接
-p:显示监听指定的套接字的进程的进程号及进程名
#!/bin/bash
#
REPOPFILE=/etc/yum.repos.d/$1
if [ -e $REPOPFILE ]; then
echo"$1 exitsts."
exit3
fi
read -p "REPOPFILE ID" REOPID
util [ $REOPID== "quit" ]; do
echo""
循环控制:
break
中断循环,而后执行循环后面的语句;
continue
中断当前这一次循环,提前进入下一软循环
写一个脚本,完成以下功能:
1、提示用户输入一个用户名;
2、显示一个菜单给用户,形如:
U|u show UID
G|g show GID
S|s show SHELL
Q|q quit
3、提醒用户选择一个选项,并显示其所选择的内容;
如果用户给的是一个非上述所提示的选项,则提醒用户给出的选项错误,并请其重新选择后执行;
写一个脚本:
1、判断一个指定的bash脚本是否有语法错误;如果有错误,则提醒用户键入Q或者q无视错误并退出,其它任何键可以通过vim打开这个指定的脚本;
2、如果用户通过vim打开编辑后保存退出时仍然有错误,则重复第1步中的内容;否则,就正常关闭退出。
./syntax.sh a.sh
until bash -n $1 &> /dev/null; do
read-p "Syntax error, [Qq] to quit, others for editing: " CHOICE
case$CHOICE in
q|Q)
echo "Something wrong, quiting."
exit 5
;;
*)
vim+ $1
;;
esac
done
echo "0K"
函数:功能, function
代码重用:
库:so
脚本编程之函数:
function: 功能
结构化编程,不能独立运行,需要调用时执行,可以被多次调用
定义一个函数:
function FUNCNAME {
command
}
FUNCNAME() {
command
}
自定义执行状态返回值:
return #
0-255
接受参数的函数:
./a.sh m n
$1: m
$2: n
TWOINT 5 6
$1: 5
$2: 6
练习:写一个脚本,判定192.168.0.200-192.168.0.254之间的主机哪些在线。要求:
1、使用函数来实现一台主机的判定过程;
2、在主程序中来调用此函数判定指定范围内的所有主机的在线情况。
#!/bin/bash
#
PING() {
forI in {200..254};do
if ping -c 1 -W 1 192.168.0.$I &> /dev/null; then
echo "192.168.0.$I is up."
else
echo "192.168.0.$I is down."
fi
done
}
PING
#!/bin/bash
#
PING() {
if ping -c 1 -W 1 $1 &> /dev/null; then
echo "$1 is up."
else
echo "$1 is down."
fi
}
for I in {200..254}; do
PING 192.168.0.$I
done
#!/bin/bash
#
PING() {
if ping -c 1 -W 1 $1 &> /dev/null; then
return 0
else
return 1
fi
}
for I in {200..254}; do
PING 192.168.0.$I
if[ $? -eq 0 ]; then
echo "192.168.0.$I is up."
else
echo "192.168.0.$I is down."
fi
done
写一个脚本:使用函数完成
1、函数能够接受一个参数,参数为用户名;
判断一个用户是否存在
如果存在,就返回此用户的shell和UID;并返回正常状态值;
如果不存在,就说此用户不存在;并返回错误状态值;
2、在主程序中调用函数;
扩展1:在主程序中,让用户自己输入用户名后,传递给函数来进行判断;
扩展2:在主程序中,输入用户名判断后不退出脚本,而是提示用户继续输入下一个用户名;如果用户输入的用户不存在,请用户重新输入;但如果用户输入的是q或Q就退出;
#!/bin/bash
#
user () {
if id $1 &> /dev/null ;then
echo "`grep ^$1 /etc/passwd | cut -d: -f3,7`"
return 0
else
echo "no $1"
return 1
fi
}
read -p "please input username:"username
until [ $username == q -o $username == Q ];do
user$username
if[ $? == 0 ];then
read-p "please input again:" username
else
read-p "no $username,please input again:" username
fi
done
函数也可以接受参数, 即可以向函数传递参数
函数接受一个用户名参数,显示此用户的shell和UID;
写一个函数:接受一命令参数ls
/bin/ls, /mnt/sysroot/bin/ls
/sbin/ifconfig, /mnt/sysroot/sbin/ifconfig
进程及作业管理
Uninterruptible sleep: 不可中断的睡眠
Interruptible sleep:可中断睡眠
kernel:
init:
COW: Copy On Write, 写时复制
100-139:用户可控制
0-99:内核调整的
O:
O(1)
O(n)
O(logn)
O(n^2)
O(2^n)
init: 进程号为1
ps: Process State
SysV风格:-
BSD风格:
a:所有与终端有关的进程
u:详细信息
x:所有与终端无关的进程
进程的分类:
跟终端相关的进程
跟终端无关的进程
进程状态:
D:不可中断的睡眠
R:运行或就绪
S:可中断的睡眠
T:停止
Z:僵死
<:高优先级进程
N: 低优先级进程
+:前台进程组中的进程
l:多线程进程
s:会话进程首进程
ps
-elF
-ef
-eF
ps -o PROPERTY1,PROPERTY2
ps -o pid,comm,ni
pstree: 显示当前系统上的进程树
pgrep:
pidof: 根据程序名称,查找其相关进程的ID号;
top:
vmstat
free
kill
pkill
bg
fg
<:高优先级的进程
N:低优先级的进程
l: 多线程进程
+:前台进程组中的进程
s: 会话进程的领导者
top:
M:根据驻留内存大小进行排序
P:根据CPU使用百分比进行排序
T:根据累计时间进行排序
l:是否显示平均负载和启动时间
t:是否显示进程和CPU状态相关信息
m:是否显示内存相关信息
c:是否显示完整的命令行信息
q:退出top
k:终止某个进程
top
-d:指定延迟时长,单位是秒
-b:批模式
-n#:在批模式下,共显示多少批
进程间通信(IPC: Inter Process Communication)
共享内存
信号: Signal
Semaphore
重要的信号:
1:SIGHUP: 让一个进程不用重启,就可以重读其配置文件,并让新的配置信息生效;
2: SIGINT:Ctrl+c: 中断一个进程
9: SIGKILL:杀死一个进程
15: SIGTERM:终止一个进程, 默认信号 可以释放资源
指定一个信号:
信号号码:kill -1
信号名称:kill-SIGKILL
信号名称简写:kill-KILL
kill PID
killall COMMAND
调整nice值:
调整已经启动的进程的nice值:
renice NI PID
在启动时指定nice值:
nice -n NI COMMAND
前台作业:占据了命令提示符
后台作业:启动之后,释放命令提示符,后续的操作在后台完成
前台-->后台:
Ctrl+z:把正在前台的作业送往后台
COMMAND&:让命令在后台执行
bg: 让后台的停止作业继续运行
bg[[%]JOBID]
jobs: 查看后台的所有作业
作业号,不同于进程号
+:命令将默认操作的作业
-:命令将第二个默认操作的作业
fg: 将后台的作业调回前台
fg[[%]JOBID]
kill %JOBID: 终止某作业
vmstat:系统状态查看命令
uptime:
/proc/meminfo
./configure:
检查编译环境:编译工具、库、头文件
设定编译安装选项
结果:结果Makefile.in生成makefile
make
make install