SHELL编程进阶
一、各类循环语句的用法
1. 条件选择if语句
if 判断条件;then
当判断条件为真时执行
else
当判断条件为假时执行
fi
2. 条件判断 case 语句
case 变量 in
指定内容1)输出 ;;
指定内容2)输出 ;;
……
指定内容3)输出 ;;
esac
其中在指定内容中支持 *、?、[ ]、| 这几个文件通配符
3. 循环语句
第一种: for 变量名 in 指定列表;do
循环体
done
第二种: while 循环控制条件 ;do
循环体
done
(其中循环控制条件为真时进行循环)
第三种: until 循环控制条件 ;do
循环体
done
(其中循环控制条件为假时进行循环)
在循环体中出现 continue 时,则立刻结束当前判断条件下的循环,进入下一个判断条件继续执行循环;
在循环体中出现 break 时,则循环立刻全部结束;
在循环体中出现 shift 时,表示参数列表每执行一次循环就去除第一个参数,直至参数为0 个时,结束循环。
4. 无限循环的创建方式
第一种 : while true ; do
循环体
done
第二种: until false ;do
循环体
done
5. while特殊用法
while read line;do
循环体
done < 需要读取的文件
此循环表示依次读取文件中的每一行,并将内容赋值给变量line(其中变量line可以为任何指定的字符)
也可不需要在 done 后导入文件,可以通过命令执行然后传导给while,例如:df | grep “/dev/sda”|while read line
6. for 特殊用法
for ((变量赋值;判断条件;变量的修正));do
循环体
done
其中,变量赋值只执行一次,然后每循环一次变量修正一次再去进行条件判断。直至条件判断为假,结束循环。
7. select 循环
select循环主要是用于菜单的创建,通常情况是与case 一同使用的,并且利用PS3提示符来显示用户要输入的内置变量 REPLY,举例如下:
选择水果,并显示出水果的价格
#!/bin/bash
PS3="Please choose yourfruit: "
select menu in apple bananaorange quit;do
case $REPLY in
1)echo "The prise is $10";;
2)echo "The prise is $5";;
3)echo "The prise is $6";;
*)break;;
esac
done
8. 信号捕捉trap
trap ‘触发指令’+ 信号 不执行原信号操作,执行触发指令
‘’+ 信号 忽略信号的操作
‘-’+ 信号 恢复原信号的操作
trap -p 列出自定义的的信号操作
举例如下:
#!/bin/bash
trap 'echo haha' int
trap -p
for ((n=1;n<=15;n++));do
echo $n
sleep 1
done
trap '' int
for ((n=16;n<=30;n++));do
echo $n
sleep 1
done
trap '-' int
for ((n=31;n<=60;n++));do
echo $n
sleep 1
done
二、函数介绍及使用
1. 函数的基本格式:
function_name ( ) {
函数体
}
其中函数被使用前,必须是已经定义了的,先后顺序。
return 表示从函数中返回
return 0 无错误返回; return 1-255 有错误返回
2. 函数中的变量有效范围
内部函数:变量的定义,只对当前函数有效。
declare -i 定义整数
local 定义字符串
全局函数:变量的定义,对当前shell有效。
declare -ig或不用declare
环境函数:变量的定义,对当前shell及子shell都有效。
export -f 或declare -xf
3. set 可以查看已经载入的函数
. | source +函数名(正确路径)表示将函数载入shell
unset + 函数名 表示删除函数定义
三、数组
1. 索引:编号从0开始,属于数值索引
关联索引:自定义变量对应字符
declare -a 显示索引数组
declare -A 显示关联数组
在创建数组前,通过 “declare –a|A” 表明数组类型
1. 数组赋值方式
a. 每次赋值一个 数组名[数字]=被赋值个体
b. 一次性赋值 数组名=(被赋值个体1 被赋值个体2 被赋值个体3)
c. 给多文件赋值 数组名=(文件路径)(例如:/etc/*.conf)
d. 用read -a +数组名,然后输入需要赋值的个体
2. 数组的引用
${数组名[索引]} 表示取出对应索引名的元素
若不加[索引],表示取出[0]索引的元素
${数组名[*|@]} 表示引用数组的所有元素
${#数组名[*|@]} 表示数组中的元素的个数
数组切片:${数组名[@]:offset:number}
offset: 要跳过的元素个数
number: 要取出的元素个数
${数组名[@]:offset} 表示取偏移量后的所有元素
数组名[${#数组名[*]}]=新加的元素名
====================================================================
进程管理
一、进程管理工具
1.pstree 以树状图显示系统进程;加上“-p”选项,则会同时显示进程号
2.ps 可以来查看进行信息,接上如下选项:
a 显示所有终端上运行的前台进程
u 显示用户名
x 显示当前用户所运行的所有进程,包括前台和后台守护进程
可以合并使用ps aux
常用组合:-ef
-e: 显示所有进程
-f: 显示完整格式程序信息
常用组合:-eFH
-F: 显示更完整格式的进程信息
-H: 以进程层级格式显示进程相关信息
常用组合:自定义显示需要显示的信息
-eo (pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,comm)
-axo (stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm)
5. 进程优先级
开始运行时前设置nice值
nice -n +设定值 +命令/进程号
运行过程中修改nice值
renice -n +设定值 +命令/进程号
其中“设定值必须是1-19的数”,进程号用“pidof +进程名”显示
6. pgrep 搜索进程命令
-u username/uid 查看指定用户所运行的所有进程的进程号
-lu username/uid 查看指定用户所运行的所有进程的进程号及进程名
-t 终端名 查看指定终端所运行的所有进程的进程号
-lt 终端名 查看指定终端所运行的所有进程的进程号及进程名
-P 进程号 查看指定进程的子进程的进程号
5. kill 进程运行时的管理工具
1)SIGHUP: 无须关闭进程而让其重读配置文件
2)SIGINT: 中止正在运行的进程,相当于ctrl+c
3)SIGQUIT: ctrl+\
9)SIGKILL 强制杀死正在运行的进程
15)SIGTERM 终止正在运行的进程
18)SIGCONT: 将休眠的进程放入后台运行
19)SIGSTOP: 将进程休眠
例如:kill -1/SIGHUP/HUP +进程号
二、作业管理
1. 作业控制内容
前台作业:通过终端启动,启动后会一直占据终端
后台作业:通过终端启动,启动后就立刻进入后台运行,从而释放终端
ctrl + Z 将前台进程暂停
fg 将当前终端上运行的后台进程放入前台运行
bg 将前台暂停的进程放入后台运行
可通过 “命令 + &”直接让命令运行时直接放入后台
jobs 可以查看当前终端的进程
2. 为了防止进程因终端关闭而结束,可采取以下方法:
方法一:将进程运行在后台(两种方法)
1)先前台运行,然后ctrl+z 暂停,再bg
2) 运行命令后加上 &
方法二:
输入screen命令后,再输入需要执行的命令
方法三:
nohup ./test.sh &>/dev/null &
3.使多进程并行运行
可将需要执行的进程命令分别写入脚本,然后进行以下操作:(例如:)
方法一: #!/bin/bash
/app/bin/test.sh&
/app/bin/test2.sh &
/app/bin/test3.sh &
方法二:
(./test.sh &);(./test2.sh &);(./test3.sh &)
方法三:
{ ./test.sh & ./test2.sh & ./test3.sh & }
三、任务计划
1. at命令(临时性)
当/etc/at.allow不存在时,为黑名单模式,写入/etc/at.deny的用户不能at
当/etc/at.allow存在时,为白名单模式,/etc/at.deny文件失效,写入/etc/at.allow的用户才能at
常用选项:
-V 显示版本信息:
-l: 列出指定队列中等待运行的作业;相当于atq
-d: 删除指定的作业;相当于atrm
-c: 查看具体作业任务
-f /path/from/somefile:从指定的文件中读取任务
-m:当任务被完成之后,将给用户发送邮件,即使没有标准输出
注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户
TIME:定义出什么时候进行 at 这项任务的时间
HH:MM [YYYY-mm-dd] (写具体的时间)
noon(中午十二点), midnight(晚上十二点), teatime(下午4点)
tomorrow(明天)
now+#{minutes,hours,days,OR weeks}
2. crontab命令(循环性)
crontab -e 设置当前用户的计划任务
当/etc/cron.allow不存在时,为黑名单模式,写入/etc/cron.deny的用户不能crontab -e
当/etc/cron.allow存在时,为白名单模式,/etc/cron.deny文件失效,写入/etc/cron.allow的用户才能crontab -e
其中格式为:
其他的参数选项为:
-l 查看用户的计划任务
-u username 指定用户名
-r 删除指定用户的全部计划任务