shell之脚本练习
脚本需求集合贴-自主开发的
对频繁执行的任务有编写脚本的价值
对单次执行的任务就用笨的,简单的办法 1.对asterisk写一个脚本
查日志
输入日期--能够输出对应日期的日志
输入多个条件--能够输出and或者or的结果 2.修改配文,按行去弄
通过一个脚本可以修改多个配置文件
输入配置文件名,再输入行号,再输入操作类型,增删改查,再输入内容
验证输出结果是否正确。
做一个需求流程图 需求分析-方案设计-具体实现 训练点
sed,echo,test,if,while,shift .
需求分析:练习test的-d
方案设计:体现的是思路,先定义一个变量,用条件去判断
具体实现:
输入:如下
[root@-shiyan sh]# cat > mytest
a=/root/sh/sed
if [ -d $a ]
then
echo "$a is a directory"
fi
输出:正确满意
[root@-shiyan sh]# chmod u+x mytest
[root@-shiyan sh]# ./mytest
/root/sh/sed is a directory .
需求分析:上一步虽然实现,但只有一个目录,并且是死的,不灵活。并且如果不是目录,没有相应的输出。
方案设计:把目录换成文件,加入非目录时的输出。
具体实现:用sed在命令行直接修改源文件。即可
要点:-e,多次编辑要用到。
输入:如下
[root@-shiyan sh]# sed -i -e 's/sed/mem/' -e '/echo/a\\else echo "$a is a file"' mytest
输出:正确满意
[root@-shiyan sh]# ./mytest
/root/sh/mem is a file .
需求分析:将目录在脚本里定死,不方便,如何去在命令行传入文件名参数,这样就方便了。
方案设计:
具体实现:用sed在命令行直接修改源文件,注释掉第一行
输入:如下
[root@-shiyan sh]# sed -i -e '1s/a/#&/' -e 's/\$a/\$1/' mytest
[root@-shiyan sh]# cat mytest
#a=/root/sh/mem
if [ -d $ ]
then
echo "$1 is a directory"
else echo "$1 is a file"
fi
输出:正确满意
[root@-shiyan sh]# ./mytest for
for is a file
[root@-shiyan sh]# ./mytest awk
awk is a directory .
需求分析:如果能在命令行测试多个文件或目录就好了
方案设计: 每次循环时加入一个条件判断即可,并相应输出。
具体实现:用while循环与shift来实现位置参数个数的不确定,
要点:until循环和while循环的结构基本相同,但是until是判断条件表达式为假时才继续循环!
难点:
-n是用来测试字符串是否为空的
$# 位置参数的个数,shift后个数每次减1个。
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
该变量包含了所有输入的命令行参数值。如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm
此时 $* 包含了 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.
输入:如下,第一行用while或until都可以
[root@-shiyan sh]# vi mytest1
while [ -n "$*" ] 或者 until [ $# -eq 0 ]
do
if [ -d $ ]
then
echo -e "\033[31m$1\033[m\t is a directory"
else echo -e "\033[32m$1\033[m\t is a file"
fi
shift
done
输出:正确满意
[root@250-shiyan sh]# ./mytest awk conn eth.sh mem sed
awk is a directory
conn is a file
eth.sh is a file
mem is a file
sed is a directory
目的:查看别的进程在做什么,重在处理一个目的的思路,可能有多种思路,但要沿着每条思路走下去,一探究竟。 ####查看当前登录用户
[root@localhost ~]# w
:: up min, users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/ 192.168.2.80 : .00s .13s .00s w
root pts/ 192.168.2.80 : : .04s .00s vi install.log
####知道了有个用户在用vi程序,然后查看vi占用的程序,知道了是1472这个进程
[root@localhost ~]# lsof -c vi
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vi root cwd DIR , /root
vi root rtd DIR , /
vi root txt REG , /bin/vi
vi root mem REG , /lib64/libnss_files-2.12.so
vi root mem REG , /usr/lib/locale/locale-archive
vi root mem REG , /lib64/libattr.so.1.1.
vi root mem REG , /lib64/libdl-2.12.so
vi root mem REG , /lib64/libtinfo.so.5.7
vi root mem REG , /lib64/libc-2.12.so
vi root mem REG , /lib64/libacl.so.1.1.
vi root mem REG , /lib64/libncurses.so.5.7
vi root mem REG , /lib64/libselinux.so.
vi root mem REG , /lib64/libm-2.12.so
vi root mem REG , /lib64/ld-2.12.so
vi root 0u CHR , 0t0 /dev/pts/
vi root 1u CHR , 0t0 /dev/pts/
vi root 2u CHR , 0t0 /dev/pts/
vi root 4u REG , /root/.install.log.swp
####接着查看进程树,找进程1472的父子关系
[root@localhost ~]# pstree -p
init()─┬─auditd()───{auditd}()
├─crond()
├─master()─┬─pickup()
│ └─qmgr()
├─mingetty()
├─mingetty()
├─mingetty()
├─mingetty()
├─mingetty()
├─mingetty()
├─rsyslogd()─┬─{rsyslogd}()
│ ├─{rsyslogd}()
│ └─{rsyslogd}()
├─sshd()─┬─sshd()───bash()───pstree()
│ └─sshd()───bash()───vi()
└─udevd()─┬─udevd()
└─udevd()
####杀掉vi
[root@localhost ~]# kill -
####杀掉1432的bash,也意味着关闭了那个终端
[root@localhost ~]# kill - ####这一步可以直接关闭想要关闭的终端。先查看再kill就行了。
查看有两个用户在登录,并且它们的bash pid可以显示,点表示现在忙,例如vi一个文件之类的都显示为点,空闲时显示为 小时:分钟
[root@localhost ~]# who -a
system boot -- :
run-level -- :
LOGIN tty2 -- : id=
LOGIN tty1 -- : id=
LOGIN tty3 -- : id=
LOGIN tty4 -- : id=
LOGIN tty5 -- : id=
LOGIN tty6 -- : id=
root + pts/ -- : . (192.168.2.80)
root + pts/ -- : . (192.168.2.80)
[root@localhost ~]# kill -
训练点
特殊变量,while,shift,until,local,return,function.
在脚本文件内部定义
从命令行传递参数
从文件传递参数 .
需求分析:将命令行参数逐行打印
方案设计:使用特殊变量,从命令行传递参数
具体实现:
输入:如下
[root@-shiyan frag]# cat >aa.sh
echo "Please input arguements is $# "
echo "What you input : "
while [[ $* != "" ]]
do
echo $
shift
done
输出:正确满意
[root@-shiyan frag]# ./aa.sh 34j
Please input arguements is
What you input :
34j .
很多情况都是这种方式,都是将变量,常量或函数集体存放,然后统一调用,用点去调用
[root@-shiyan aa]# cat /etc/init.d/network
# Source function library.
. /etc/init.d/functions if [ ! -f /etc/sysconfig/network ]; then
exit
fi . /etc/sysconfig/network if [ -f /etc/sysconfig/pcmcia ]; then
. /etc/sysconfig/pcmcia
fi
需求分析:将所有变量与常量写入到一个文件,然后在脚本文件中调用此文件中的变量
方案设计:
具体实现:
输入:如下
[root@-shiyan aa]# cat varis
f=
eth=`ifconfig eth0|grep "TX bytes"|gawk '{print $6}'|cut -d ":" -f2`
i=`echo "scale=2;$f*1.11"|bc`
[root@-shiyan aa]# cat math.sh
. varis
echo $i
[root@-shiyan aa]# cat until.sh
[ -f varis ] && . varis
until [ $f -lt ]
do
echo $f
((f--))
done
输出:正确满意
[root@-shiyan aa]# bash math.sh
3.33
[root@-shiyan aa]# bash until.sh .
[root@-shiyan frag]# cat ui.sh
echo $(uname)
num=
uname()
{
echo "test!"
((num++))
return
}
testvar()
{
local num=
((num++))
echo $num
}
uname
echo $?
echo $num
testvar
echo $num
[root@-shiyan frag]# bash ui.sh
Linux
test! .
需求分析:周期执行自动更改密码,更改后发邮件通知,放入crontab中定期执行。 [root@-shiyan frag]# cat chpa1.sh
(date|md5sum|tee -a cccc -)|passwd
tail - cccc|mail -s "pa" createyuan@sohu.com
shell之脚本练习的更多相关文章
- shell及脚本4——shell script
一.格式 1.1 开头 必须以 "# !/bin/bash" 开头,告诉系统这是一个bash shell脚本.注意#与!中间有空格. 二.语法 2.1 数值运算 可以用decla ...
- 【Telnet】使用Telnet协议连接到远程Shell执行脚本
介绍 本文介绍如何通过Telnet协议连接到远程Shell,执行脚本,并获取执行结果: 相关文章: <[Jsch]使用SSH协议连接到远程Shell执行脚本>http://www.cnbl ...
- shell自动计算脚本
shell自动计算脚本 #!/bin/bash echo $(($)) [root@bogon ~]# sh b.sh 123+123246 let用户声明这个操作是要计算,后者的效率更高 (expr ...
- Shell菜单脚本
今天在这儿给大家分享一个我简单编写的Shell菜单脚本,傻瓜式的人机交互,人人都可以操作linux. #!/bin/sh #Shell菜单演示 function menu () { cat <& ...
- shell常见脚本30例
shell常见脚本30例 author:headsen chen 2017-10-19 10:12:12 本文原素材出自网上,特此申明.有些地方加入我自己的改动 常见的30例shell脚本 1.用 ...
- shell常用脚本
shell常用脚本 author:headsen chen 2017-10-17 15:36:17 个人原创,转载请注明,否则依法追究法律责任 1,vim name.grep.sh 2,cat ...
- 一篇关于Maven项目的jar包Shell启动脚本
使用Maven作为项目jar包依赖的管理,常常会遇到命令行启动,笔者也是哥菜鸟,在做微服务,以及服务器端开发的过程中,常常会遇到项目的启动需要使用main方法,笔者潜心的研究了很多博客,发现大多写的都 ...
- Linux shell编写脚本部署pxe网络装机
Linux shell编写脚本部署pxe网络装机 人工安装配置,Linux PXE无人值守网络装机 https://www.cnblogs.com/yuzly/p/10582254.html 脚本实 ...
- 使用shell解析脚本依赖关系,并自动补数
将脚本依赖关系放到表中 使用shell解析脚本依赖关系,递归的计算各个脚本. #!/bin/bash # dm 补数 basepath=$(cd ``; pwd) cd $basepath sourc ...
- shell监控脚本
序言: 前几天一好友问我服务器监控怎么做?你们公司的监控是怎么做的?有什么开源的监控软件推荐?常见的开源的监控软件当然首先推荐ZABBIX,分布式够强大,而且很多公司都在用,我问他具体什么需求,能监控 ...
随机推荐
- php大力力 [029节] 做PHP项目如何下载js文件:使用腾讯浏览器把网上案例页面存储到本地
php大力力 [029节] 做PHP项目如何下载js文件:使用腾讯浏览器把网上案例页面存储到本地 yeah,搞定啦 php大力力 [029节] 做PHP项目如何下载js文件:使用腾讯浏览器把网上案例页 ...
- typedef的用法
我最开始学习的是C++,而不是C语言.虽说C++涵盖了C,但是C++的语法更加方便,比如输入输出……但是为了与C兼容,常常需要保留C语言的用法,这就比较烦人了,因为我们都希望有一个固定的语法. 首先让 ...
- mantis增加密码修改
解决方式就是考虑修改Mantisbt PHP程序,增加一个密码修改框,这样管理员就可以直接修改用户密码了. 操作步骤如下: 1) 修改文件 manage_user_edit_page.p ...
- 【Oracle XE系列之二】PLSQL Developer 远程连接Oracle XE数据库
1.去http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html下载Instant Cli ...
- 初始React Native
1.何是React Native: React-Native是:Facebook 在2015年初React.js技术研讨大会上公布的一个开源项目.支持用开源的JavaScript库React.js来开 ...
- 禁止VMware用户在系统里删除网卡的操作的方法
点击选项-常规-配置参数,如下图所示: 8)点击“添加行”,在新的栏目中,左栏输入:devices.hotplug,右边栏输入:false
- tcpdump抓包规则命令大全
下面的例子全是以抓取eth0接口为例,如果不加”-i eth0”是表示抓取所有的接口包括lo. 1.抓取包含10.10.10.122的数据包 # tcpdump -i eth0 -vnn host 1 ...
- android定时更新文件
static变量在程序退出时不会清空的,除非系统内存不足以运行其他程序,才会清空.给SD卡上的文件过期时间.可以简单的在给文件命名时后面加个创建时间,在下次访问时判断是否需要更新.比如本来文件名是 i ...
- 用Rprofile文件配置打开时R的设置
R中经常会使用一些命令,而且需要重复输入,非常麻烦.如果能够一打开R就直接使用会方便很多. 通过配置一个.Rprofile文件,可以达到我们的目的. 注:本文仅适用于Mac # 创建一个.Rprofi ...
- PHP生成图片验证码(simple)
php新手,写了一个web登录界面,除了用户名,密码,感觉有个验证码会比较cool一点,便根据参考书的简单介绍,写了一个image.php来生成简单的图片验证码,颇有感慨,分享一下. 1. 图片验 ...