设为首页 收藏本站
查看: 1172|回复: 0

shell之脚本练习

[复制链接]

尚未签到

发表于 2015-12-4 09:11:51 | 显示全部楼层 |阅读模式
  



做一个需求流程图
需求分析-方案设计-具体实现
训练点
sed,echo,test,if,while,shift
1.
需求分析:练习test的-d
方案设计:体现的是思路,先定义一个变量,用条件去判断
具体实现:
输入:如下
[iyunv@250-shiyan sh]# cat > mytest
a=/root/sh/sed
if [ -d $a ]
then
echo "$a is a directory"
fi
输出:正确满意
[iyunv@250-shiyan sh]# chmod u+x mytest
[iyunv@250-shiyan sh]# ./mytest
/root/sh/sed is a directory
2.
需求分析:上一步虽然实现,但只有一个目录,并且是死的,不灵活。并且如果不是目录,没有相应的输出。
方案设计:把目录换成文件,加入非目录时的输出。
具体实现:用sed在命令行直接修改源文件。即可
要点:-e,多次编辑要用到。
输入:如下
[iyunv@250-shiyan sh]# sed -i -e 's/sed/mem/' -e '/echo/a\\else echo "$a is a file"' mytest
输出:正确满意
[iyunv@250-shiyan sh]# ./mytest
/root/sh/mem is a file
3.
需求分析:将目录在脚本里定死,不方便,如何去在命令行传入文件名参数,这样就方便了。
方案设计:
具体实现:用sed在命令行直接修改源文件,注释掉第一行
输入:如下
[iyunv@250-shiyan sh]# sed -i -e '1s/a/#&/' -e 's/\$a/\$1/' mytest
[iyunv@250-shiyan sh]# cat mytest
#a=/root/sh/mem
if [ -d $1 ]
then
echo "$1 is a directory"
else echo "$1 is a file"
fi
输出:正确满意
[iyunv@250-shiyan sh]# ./mytest for
for is a file
[iyunv@250-shiyan sh]# ./mytest awk
awk is a directory
4.
需求分析:如果能在命令行测试多个文件或目录就好了
方案设计: 每次循环时加入一个条件判断即可,并相应输出。
具体实现:用while循环与shift来实现位置参数个数的不确定,
要点:until循环和while循环的结构基本相同,但是until是判断条件表达式为假时才继续循环!
难点:
-n是用来测试字符串是否为空的
$# 位置参数的个数,shift后个数每次减1个。
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
该变量包含了所有输入的命令行参数值。如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm
此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.
输入:如下,第一行用while或until都可以
[iyunv@250-shiyan sh]# vi mytest1
while [ -n "$*" ] 或者 until [ $# -eq 0 ]
do
if [ -d $1 ]
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
输出:正确满意
[iyunv@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

  



目的:查看别的进程在做什么,重在处理一个目的的思路,可能有多种思路,但要沿着每条思路走下去,一探究竟。
####查看当前登录用户
[iyunv@localhost ~]# w
23:10:41 up 46 min,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.2.80     22:35    0.00s  0.13s  0.00s w
root     pts/1    192.168.2.80     22:57    4:23   0.04s  0.00s vi install.log
####知道了有个用户在用vi程序,然后查看vi占用的程序,知道了是1472这个进程
[iyunv@localhost ~]# lsof -c vi
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
vi      1472 root  cwd    DIR  253,0     4096 130306 /root
vi      1472 root  rtd    DIR  253,0     4096      2 /
vi      1472 root  txt    REG  253,0   764088 521383 /bin/vi
vi      1472 root  mem    REG  253,0    65928 521249 /lib64/libnss_files-2.12.so
vi      1472 root  mem    REG  253,0 99158576 784025 /usr/lib/locale/locale-archive
vi      1472 root  mem    REG  253,0    18712 521281 /lib64/libattr.so.1.1.0
vi      1472 root  mem    REG  253,0    19536 521239 /lib64/libdl-2.12.so
vi      1472 root  mem    REG  253,0   135896 521277 /lib64/libtinfo.so.5.7
vi      1472 root  mem    REG  253,0  1921216 521233 /lib64/libc-2.12.so
vi      1472 root  mem    REG  253,0    31280 521299 /lib64/libacl.so.1.1.0
vi      1472 root  mem    REG  253,0   140096 521273 /lib64/libncurses.so.5.7
vi      1472 root  mem    REG  253,0   122040 521307 /lib64/libselinux.so.1
vi      1472 root  mem    REG  253,0   596264 521241 /lib64/libm-2.12.so
vi      1472 root  mem    REG  253,0   154520 521226 /lib64/ld-2.12.so
vi      1472 root    0u   CHR  136,1      0t0      4 /dev/pts/1
vi      1472 root    1u   CHR  136,1      0t0      4 /dev/pts/1
vi      1472 root    2u   CHR  136,1      0t0      4 /dev/pts/1
vi      1472 root    4u   REG  253,0    16384 137725 /root/.install.log.swp
####接着查看进程树,找进程1472的父子关系
[iyunv@localhost ~]# pstree -p
init(1)─┬─auditd(895)───{auditd}(896)
├─crond(1047)
├─master(1037)─┬─pickup(1043)
│              └─qmgr(1044)
├─mingetty(1062)
├─mingetty(1064)
├─mingetty(1066)
├─mingetty(1073)
├─mingetty(1076)
├─mingetty(1374)
├─rsyslogd(911)─┬─{rsyslogd}(912)
│               ├─{rsyslogd}(914)
│               └─{rsyslogd}(915)
├─sshd(960)─┬─sshd(1375)───bash(1379)───pstree(1498)
│           └─sshd(1428)───bash(1432)───vi(1472)
└─udevd(386)─┬─udevd(1072)
└─udevd(1075)
####杀掉vi
[iyunv@localhost ~]# kill -9 1472
####杀掉1432的bash,也意味着关闭了那个终端
[iyunv@localhost ~]# kill -9 1432
####这一步可以直接关闭想要关闭的终端。先查看再kill就行了。
查看有两个用户在登录,并且它们的bash pid可以显示,点表示现在忙,例如vi一个文件之类的都显示为点,空闲时显示为 小时:分钟
[iyunv@localhost ~]# who -a
system boot  2015-02-04 22:24
run-level 3  2015-02-04 22:24
LOGIN      tty2         2015-02-04 22:24              1062 id=2
LOGIN      tty1         2015-02-04 22:34              1374 id=1
LOGIN      tty3         2015-02-04 22:24              1064 id=3
LOGIN      tty4         2015-02-04 22:24              1066 id=4
LOGIN      tty5         2015-02-04 22:24              1073 id=5
LOGIN      tty6         2015-02-04 22:24              1076 id=6
root     + pts/0        2015-02-04 22:35   .          1379 (192.168.2.80)
root     + pts/1        2015-02-04 22:57   .          1432 (192.168.2.80)
[iyunv@localhost ~]# kill -9 1432
  



训练点
特殊变量,while,shift,until,local,return,function.
在脚本文件内部定义
从命令行传递参数
从文件传递参数
1.
需求分析:将命令行参数逐行打印
方案设计:使用特殊变量,从命令行传递参数
具体实现:
输入:如下
[iyunv@250-shiyan frag]# cat >aa.sh
echo "Please input arguements is $# "
echo  "What you input : "
while [[ $* != "" ]]
do
echo $1
shift
done
输出:正确满意
[iyunv@250-shiyan frag]# ./aa.sh 34j 565 6767 23424 234234
Please input arguements is 5
What you input :
34j
565
6767
23424
234234
2.



很多情况都是这种方式,都是将变量,常量或函数集体存放,然后统一调用,用点去调用
[iyunv@250-shiyan aa]# cat /etc/init.d/network
# Source function library.
. /etc/init.d/functions
if [ ! -f /etc/sysconfig/network ]; then
exit 6
fi
. /etc/sysconfig/network
if [ -f /etc/sysconfig/pcmcia ]; then
. /etc/sysconfig/pcmcia
fi


需求分析:将所有变量与常量写入到一个文件,然后在脚本文件中调用此文件中的变量
方案设计:
具体实现:
输入:如下
[iyunv@250-shiyan aa]# cat varis
f=3
eth=`ifconfig eth0|grep "TX bytes"|gawk '{print $6}'|cut -d ":" -f2`
i=`echo "scale=2;$f*1.11"|bc`
[iyunv@250-shiyan aa]# cat math.sh
. varis
echo $i
[iyunv@250-shiyan aa]# cat until.sh
[ -f varis ] && . varis
until [ $f -lt 0 ]
do
echo $f
((f--))
done
输出:正确满意
[iyunv@250-shiyan aa]# bash math.sh
3.33
[iyunv@250-shiyan aa]# bash until.sh
3
2
1
0
3.
[iyunv@250-shiyan frag]# cat ui.sh
echo $(uname)
num=1000
uname()
{
echo "test!"
((num++))
return 100
}
testvar()
{
local num=10
((num++))
echo $num
}
uname
echo $?
echo $num
testvar
echo $num
[iyunv@250-shiyan frag]# bash ui.sh
Linux
test!
100
1001
11
1001
4.
需求分析:周期执行自动更改密码,更改后发邮件通知,放入crontab中定期执行。
[iyunv@250-shiyan frag]# cat chpa1.sh
(date|md5sum|tee -a cccc -)|passwd
tail -1 cccc|mail -s "pa" createyuan@sohu.com
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-147059-1-1.html 上篇帖子: shell脚本编写方法 下篇帖子: shell获取用户输入
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表