linux 脚本练习,shell 练习题

第1章 自用练习题

1.1 命令行传入1个字符或数字,数字等于1则显示1,如果等于2则显示2,如果既不等于1也不等于2,就显示输入不对,然后退出程序

命令解析:

将外面参数 传入到脚本内 2. 判断参数是否是1,2

对显示 不对显示提示并推出

#!/bin/bash

num=$1

[ $# -eq 1 ] || {

echo 请输入1 或 2 其他不识别

exit 3

}

[[ $num =~ ^[12]$ ]] || {

echo 请输入1 或 2 其他不识别

exit 3

}

echo 你输入的是: $num

简化一下

[[ $num =~ ^[12]$ ]] || {

echo 请输入1 或 2 其他不识别

exit 3

}

echo 你输入的是: $num

1.2 命令行输入两个参数 对比大小后输出出来

解析要求:

传参到脚本内

判断参数是数值

比对大小后输出

#!/bin/bash

read -t 120 -p “Compare number num1 num2: ”n1 n2

expr $n1 + $n2 + 22 &>/dev/null

[ $? -eq 0 ] || {

echo Please enter two Numbers

exit 55

}

[ $n1 -eq $n2 ] && echo $n1 == $n2

[ $n1 -gt $n2 ] && echo $n1 > $n2

[ $n1 -lt $n2 ] && echo $n1 < $n2

1.3 书写简单的计算器

要求 : 从命令行输入2个参数 执行两个参数的加减乘除 参数不对时提示并推出脚本 计算它们的符号要显示出来

项目分析:

只能输入两个参数 多出来提示ds

必须是数字

运算

#!/bin/bash

num1=$1

num2=$2

[ $# -ne 2 ] && {

echo 请输入两个数字运算

exit 3

}

expr $num1 + $num2 + 22 &> /dev/null

[ $? -eq 0 ] || {

echo 请输入两个数字运算

exit 3

}

#另一种判断方法

[[ $num1 =~ ^-?[0-9]+$ && $num2 =~ ^-?[0-9]+$ ]] ||{

echo 请输入两个数字运算

exit 3

}

#计算区域

echo "$num1 + $num2 = $((num1+num2))"

echo "$num1 - $num2 = `expr $num1 - $num2`"

echo "$num1 \* $num2 = `awk "BEGIN {print $num1*$num2}"`"

echo "$num1 \ $num2 = `awk "BEGIN {print $num1/$num2}"`"

可完善点 小数点暂时无法计算

1.4 开发shell脚本监控服务是否在运行 要求传参方式监控各种服务

解析 :

取出服务运行进程

判断是否在运行 给出结果

#!/bin/bash

[ $# -eq 1 ] || {

echo Enter a service name

exit 22

}

service=$1

statusa=`ps -ef|grep -Ev “grep|$0”|grep -co $service`

if [[ $statusa -ge 1 ]]

then

echo $service Service in operation

else

echo $service server not found

fi

优化点 可固定某个服务 也可用read做交互式传参

1.5 去除一段信息中字符大于n的信息

例子 I am oldboy linux.welcome to our training.

取出大于6个的字符串

解析

主要应用特殊变量${#} 取出个数

for循环取出每个字符

if判断字符长度

#!/bin/bash

n=’ I am oldboy linux.welcome to our training.’

for i in $n

do

if [ ${#i} -ge 6 ]

then

echo $i

fi

done

1.6 产生随机数比对大小 让用户猜 每次都有大小提示

解析

产生随机数变量 $RANDOM

产生一个1-60随机数记录到一个变量中

math?formula=((RANDOM%61))

read -p 交互式让用户输入数值

判断用户输入的数值大小 并提示

正确推出脚本 显示猜的次数

#!/bin/bash

n=$((RANDOM%61))

num=0

while ture

raed -p “输入一个1-60的数字: ” n1

if [ $n -eq $n1 ]

then

((num++))

echo 回答正确 你一共猜了${n}次

break

elif [ $n1 -lt $n ]

then

((num++))

echo 小了

continue

elif [ $n1 -gt $n ]

then

((num++))

echo 大了

continue

fi

done

开发服务启动脚本

解析:

了解服务启动自带命令

了解指定服务关闭命令过程

判断是否在服务运行 并给与合理的响应

加入到systemctl管理中

rsync服务为例

start == rsync --daemon # 守护进程启动命令

stop == kill pid #kill pid # 关闭用kill命令+PID号

restart === # 先关闭在启动

#!/bin/bash

stat=$1

pid=/var/run/rsyncd.pid

# 判断参数是否正确

[[ $stat =~ start|restart|stop|enable|disable ]] ||{

echo "Please enter the [ start | restart | stop | enable | disable ]"

exit 33

}

# 启动

if [ "$stat" == "start" ]

then

if [ -s "$pid" ]

then

echo "rsyncd is running"

else

rsync --daemon

fi

fi

# 关闭

if [ "$stat" == "stop" ]

then

if [ -s "$pid" ]

then

kill `cat $pid`

else

echo "rsync is stop"

fi

fi

# 重启

if [ "$stat" == "restart" ]

then

if [ -s "$pid" ]

then

kill `cat $pid`

sleep 2

rsync --daemon

else

rsync --daemon

fi

fi

加入到systenctl管理中

centos6 chkconfig管理

在cenos6系统中 服务都由chkconfig 控制开机自启动

设置开机自启动方法

编写的脚本 第二行写入

# chkconfig: 2345 99 99

解析:

2345 代表那些级别开机时运行指定脚本

99 代表开机启动的顺序

99 代表关机关闭级别

centos 7 systemctl管理

需要在 /usr/lib/system/system/下编写配置文件 让systemctl管理各项服务

文件一共三个模块:

[Unti]

After=sshd #指定在什么服务后启动 (依赖)

重要部分

[Service]

Type=forking #默认就行

ExecStart=/etc/init.d/rsyncd start #开启执行脚本

ExecStop=/etc/init.d/rsyncd stop #关闭执行脚本

ExecReload=/etc/init.d/rsyncd restart #重启执行脚本

[Install]

WantedBy=multi-user.target # 启动级别

企业shell小项目

1.1 记录用户操作的小项目

核心使用$PROMPT_COMMAND变量

在用户登陆加载目录/etc/profile.d/下编辑脚本

#!/bin/bash\

exprort PROMPT_COMMAND=’

COM=$(history 1 |set -r “s#^[ 0-9]+##g”)

TIME=$(date +%F_%T)

WHO=$USER

echo $COM $TIME $WHO >>/var/log/history.log‘

readonly PROMPT_COMMAND HISTCONTROL

完善第一点 普通用户的操作能记录到log文件内 或 删除记录文件

赋予权限 让普通用户的操作能记录到文件内

chmod o+w /var/log/history

让普通用户无法删除/更改文件 将文件锁起来

chattr +ad /var/log/history

分割记录日志文件

判断执行命令和上一条一致时不记录

1.2 取出正在使用swap的进程名称 及占用swap的大小

第1步:取出1个进程的名称和占用的swap大小

第2步:取出所有进程 swap和进程名称

第3步:排坑

命令一般不好获得使用swap的进程号等信息

我们主要使用/proc/pid号/smaps文件和/proc/pid号/cmdline文件

/proc/pid号/smaps # 记录进程的smap空间占用情况

/proc/pid号/cmdline # 记录进程名字和使用的参数信息

扩展: /proc/sys # 记录内核信息

/proc/pid号/comm #记录进程号信息

例子

shell> ls -d /proc/[0-9]* # 查看所有PID对应的信息文件

shell> cat /proc/6737/smaps |grep Swap #查看对应pid进程占用的swap空间

Swap: 120 kB

Swap: 1384 kB

Swap: 0 kB

cat -A /proc/6737/cmdline # 查看对应pid的服务和启动参数

/usr/sbin/rsyslog\@-n # 可以看到 有特殊符号 不是人类可读的感觉

对于这些不听话的命令可以使用tr进行替换

tr '\0' ' '

/usr/sbin/rsyslogd -n

开始写脚本

#!/bin/baishi

for name in `ls -d /proc/[0-9]*`

do

pid_name=`tr ‘\0’ ‘ ’

[ -z $pid_name ] && continue

pid_swap=`awk -va=0‘/Swap:/{a+=$2} END {print a}’ $name/smaps

[ $pid_swap -ne 0 ] &&{

echo 进程名:$proc_name echo 占用空间:$swap_size

}

done

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值