shell编程下
第1章 Whicle
1.1 while循环语句
|
在编程语言中,while循环(英语:while loop)是一种控制流程的陈述。利用一个返回结果为布林值(Boolean)的表达式作为循环条件,当这个表达式的返回值为“真”(true)时,则反复执行循环体内的程式码;若表达式的返回值为“假”(false),则不再执行循环体内的代码,继续执行循环体下面的代码。 因为while循环在区块内代码被执行之前,先检查陈述是否成立,因此这种控制流程通常被称为是一种前测试循环(pre-test loop)。相对而言do while循环,是在循环区块执行结束之后,再去检查陈述是否成立,被称为是后测试循环。 |
1.2 shell中while语法
while 条件
do
命令
done
1.3 while的使用场景
多用于创建守护进程
while实现web服务器搭建
脚本代码
while创建定时任务
#!/bin/bash
while true
do
uptime
sleep 0.6
done
说明:
sleep 与 usleep
sleep 单位 秒 sleep 1 休息1秒
usleep 单位 微秒 usleep 1000000 休息1s
1微秒等于百万分之一秒(10的负6次方秒)
1.4 while作用
补充定时任务功能,执行小于1秒的定时任务
循环执行某些操作,例如水果菜单
1.5 例题
这苹果多少钱一斤啊?
请猜0-60的数字
请输入你的价格:30
嘿嘿,要不你用这个价买?
再给你一次机会,请继续猜:
请输入你的价格:26
太低太低
再给你一次机会,请继续猜:
请输入你的价格:27
猜对了,就是27元
一共猜了3次,太牛了。
!/bin/bash
a=$((RANDOM%60))
while true
do
read -p "请输入一个价格" b
if [ $b -gt $a ]
then
echo "猜大了,请继续"
elif [ $b -eq $a ]
then
echo "恭喜猜对了"
else
echo "猜小了,请继续"
fi
done
完善
1.6 获取文件中的每一行
方式1:采用exec读取文件后,然后进入while循环处理。
exec <FILE
sum=0
while read line
do
cmd
done
方式2:使用cat读取文件内容,然后通过管道进入while循环处理。
cat FILE_PATH|while read line
do
cmd
done
方式3:在while循环结尾done通过输入重定向指定读取的文件。
while read line
do
cmd
done<FILE
第2章 Shell中的数组
2.1
为什么会产生Shell数组
通常在开发Shell脚本时,定义变量采用的形式为“a=l;b=2;C=3”,可如果有多个 变量呢?这时再逐个地定义就会很费劲,并且要是有多个不确定的变量内容,也会难以 进行变量定义,此外,快速读取不同变量的值也是一件很痛苦的事情,于是数组就诞生 了,它就是为了解决上述问题而出现的。
2.2
什么是shell数组
Shell的数组就是一个元素集合,它把有限个元素(变量或字符内容)用一个名字来 命名,然后用编号对它们进行区分。这个名字就称为数组名,用于区分不同内容的编 号就称为数组下标。组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量。
2.3
数组中的简单规则
[root@db03 scripts]# array=(1 2 3)
查看第一个数字
[root@db03
scripts]# echo ${array[0]}
1
查看第3字
[root@db03 scripts]# echo ${array[2]}
3
查看所有的数字
[root@db03 scripts]# echo ${array[*]}
1 2 3
[root@db03 scripts]# echo ${array[@]}
1 2 3
查看所有数字个数
[root@db03 scripts]# echo ${#array[@]}
3
2.4
数组定义的方法
array=(1 2 3) 推荐
array=([1]=one [2]=two [3]=three)
array[0]=a;array[1]=b;array[2]=c
array=(`命令`)
array=($(命令)) 推荐
2.5
两种显示的方法
array=(1 2 3 4 5)
for n in ${array[*]}
do
echo $n
done
for ((i=0;i<${#array[*]};i++))
do
echo ${array[i]}
done
2.6
例题:利用bash for循环打印下面这句话中字母数不大于6
的单词(某企业面试真题)。
I am oldboy teacher welcome to oldboy
training class
2.7
把/server/scripts下的所有文件放到数组里,然后再输出!
最后把结尾为.sh的文件改为.log。
rename .log .sh *.log
第3章 脚本运行的用法和说明
第4章 break
continue exit return
|
命令 |
说明 |
|
break |
如果省略n,则表示跳出整个循环,n表示跳出循环的层数 |
|
continue |
如果省略n,则表示跳过本次循环,忽略本次循环的剩余代码,进人循环的下一次循环。 n表示退到第n层继续循环 |
|
exit |
退出当前Shell程序,n为上一次程序执行的状态返回值。n也可以省略,在下一个Shell里可通过“$?”接收exit n的n值 |
|
return |
用于在函数里作为函数的返回值,以判断函数执行是否正确。在下一个Shell里可通过“$?”接收exit n的n值 |
简单来说即:
break 跳出循环
continue 跳出本次循环
exit
退出脚本
return
与 exit 相同,在函数中使用
4.1
break说明
[root@clsn scripts]# help break
break: break [n]
退出
for、while、或 until 循环
退出一个 FOR、WHILE 或 UNTIL 循环。如果指定了N,则打破N重
循环
退出状态:
退出状态为0除非 N 不大于或等于 1。
测试脚本内容
1 #!/bin/bash
2
3 for i in {1..5}
4
5 do
6
7 if [ $i -eq 3 ]
8
9 then
10
11 break
12
13 fi
14
15 echo $i
16
17 done
18
19 echo "ok"
View
Code break 测试脚本
脚本执行结果
[root@clsn scripts]# sh break.sh
1
2
ok
4.2
continue命令说明
[root@clsn scripts]# help continue
continue: continue [n]
继续
for、while、或 until 循环。
继续当前 FOR、WHILE 或 UNTIL 循环的下一步。
如果指定了 N, 则继续当前的第 N 重循环。
退出状态:
退出状态为 0 除非 N 不大于或等于1。
测试脚本内容
1 #!/bin/bash
2 for i in {1..5}
3 do
4 if [ $i -eq 3 ]
5 then
6 continue
7 fi
8 echo $i
9 done
10 echo "ok"
View
Code continue 测试脚本
脚本执行结果
[root@clsn scripts]# sh continue.sh
1
2
4
5
ok
4.3
exit命令说明
[root@clsn scripts]# help exit
exit: exit [n]
退出shell。
以状态 N 退出 shell。 如果 N 被省略,则退出状态
为最后一个执行的命令的退出状态。
测试脚本内容
1 #!/bin/bash
2 for i in {1..5}
3 do
4 if [ $i -eq 3 ]
5 then
6 exit
7 fi
8 echo $i
9 done
10 echo "ok"
View
Code exit 测试脚本
脚本执行结果
[root@clsn scripts]# sh exit.sh
1
2
4.4
return命令说明
[root@clsn tuichu]# help return
return: return [n]
从一个 shell 函数返回。
使一个函数或者被引用的脚本以指定的返回值 N 退出。
如果 N 被省略,则返回状态就是
函数或脚本中的最后一个执行的命令的状态。
退出状态:
返回 N,或者如果 shell 不在执行一个函数或引用脚本时,失败。
第5章 题海
5.1
使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,名称例如为:path=/oldboy
[ ! -d $path ] && mkdir $path -p
cd $path
for n in {1..10}
do
random=`echo $RANDOM$(date +%N)|md5sum|tr "[0-9]"
"a-z"|cut -c 2-11`
touch ${random}_oldboy.html
done
5.2
将以上文件名中的oldboy全部改成oldgirl(用for循环实现),并且html改成大写
path=/oldboy
[ ! -d $path ] && mkdir $path -p
cd $path
for file in `ls *oldboy.html`
do
mv $file ${file/oldboy.html/oldgirl.HTML}
done
5.3
批量创建用户并设置 随机密码
. /etc/init.d/functions
for i in {11..15}
do
password=$(echo $RANDOM|md5sum|cut -c 1-8)
useradd oldboy$i &>/dev/null &&\
echo $password|passwd --stdin oldboy$i &>/dev/null &&\
echo -e "oldboy$i\t $password" >>/tmp/userlist.txt
if [ $? -eq 0 ]
then
action "userad oldboy$i is ok" /bin/true
else
action "userad oldboy$i is fail" /bin/false
fi
done
5.4
查看10.0.0.0、24 网段的那个网址正确
5.5
Mysql启动脚本
. /etc/init.d/functions
basedir=/application/mysql
bindir=/application/mysql/bin
lockdir='/var/lock/subsys'
lock_file_path="$lockdir/mysql"
mysqld_pid_file_path=$basedir/data/db03.pid
log_success_msg(){
action
"SUCCESS! $@" /bin/true
}
log_failure_msg(){
action "ERROR! $@"
/bin/false
}
start(){
echo
$"Starting MySQL"
if test
-x $bindir/mysqld_safe
then
$bindir/mysqld_safe
&>/dev/null &
return_value=$?
if [
$return_value -eq 0 ]
then
log_success_msg "mysql Startup"
if test -w "$lockdir"
then
touch "$lock_file_path"
fi
return
$return_value
else
log_failure_msg "MySQL Startup"
return
$return_value
fi
else
log_failure_msg "Couldn't find MySQL server
($bindir/mysqld_safe)"
fi
}
stop(){
if test
-s "$mysqld_pid_file_path"
then
mysqld_pid=`cat "$mysqld_pid_file_path"`
if
(kill -0 $mysqld_pid 2>/dev/null)
then
echo $"Shutting down MySQL"
kill $mysqld_pid
return_value=$?
if [ $return_value -eq 0 ]
then
log_success_msg "mysql Stop"
if test -f "$lock_file_path"
then
rm -f "$lock_file_path"
fi
return $return_value
else
log_failure_msg "MySQL Stop."
return $return_value
fi
else
log_failure_msg "MySQL server process #$mysqld_pid is not
running!"
rm "$mysqld_pid_file_path"
fi
else
log_failure_msg "MySQL server PID file is null or not exist!"
fi
}
case "$1" in
start)
start
return_value=$?
;;
stop)
stop
return_value=$?
;;
restart)
$0
stop
sleep 2
$0
start
return_value=$?
;;
*)
echo
$"Usage:$0 {start|stop|restart}"
esac
exit $return_value
5.6
破解密码
已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字?
21029299
00205d1c
a3da1677
1f6d12dd
890684b
aaa=(
21029299
00205d1c
a3da1677
1f6d12dd
890684b
)
a=/tmp/1.txt
touch $a
for b in `seq 32767`
do
c=$(echo $b|md5sum)
echo
"$c $b" >>$a
done
for n in ${aaa[*]}
do
egrep "$n" $a
done
5.7
批量检查多个网站地址是否正常
要求:shell数组方法实现,检测策略尽量模拟用户访问思路
a=(
http://www.etiantian.org
http://www.taobao.com
http://oldboy.blog.51cto.com
http://10.0.0.7
)
for n in ${a[*]}
do
wget -T 3 -t 2 $n
&>/dev/null
if [ $?
-eq 0 ];then
echo -e
"$n ok"
else
echo
-e "$n normal"
fi
done
. /etc/init.d/functions
array=(
http://www.etiantian.org
http://www.taobao.com
http://oldboy.blog.51cto.com
http://10.0.0.7
)
checkUrl(){
wget -T 5 -t 2 --spider -q $1 &>/dev/null
if [ $? -eq 0 ]
then
action "$1 is ok" /bin/true
else
action "$1 is fail" /bin/false
fi
}
rotateCheck(){
for url in ${array[*]}
do
checkUrl $url
done
}
main(){
while true
do
rotateCheck
echo "======================"
echo "sleep 10"
sleep 10
done
}
main
5.8
写一个Shell脚本解决DOS***生产案例。
请根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100(读者根据实际情况设定),即调用防火墙命令封掉对应的IP。防火墙命令为:iptables-I
INPUT -s IP地址 -j DROP。
解答:
##############################################################
log="access.log"
while true
do
awk
'{S[$1]++}END{for(k in S) print S[k],k}' $log|sort -rn|head\
|while
read line
do
ip=`echo $line|awk '{print $2}'`
count=`echo $line|awk '{print $1}'`
if [
$count -lt 1000 ] || `grep "$ip" /tmp/beifeng.log &>/dev/null`
then
:
else
iptables -I INPUT -s $ip -j DROP &&
echo "$ip $(date +%F)" >>/tmp/beifeng.log
fi
done
sleep 180
done
shell编程下的更多相关文章
- 【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
[转]shell编程下 特殊变量.test / [ ]判断.循环.脚本排错 第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~] ...
- shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~]# cat /server/scripts/show2.sh #!/bin/ ...
- Linux_(4)Shell编程(下)
五.shell流程控制1.一重分支if 语句语法格式:if condition then command1 fi末尾的fi就是if倒过来. 写成一行: if condition; then comma ...
- 速查笔记(Linux Shell编程<下>)
转载自: http://www.cnblogs.com/stephen-liu74/archive/2011/11/04/2228133.html 五.BASH SHELL编程: 1. 初始化顺 ...
- Linux下的Shell编程
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...
- linux下shell编程示例-获取进程id
今天初步学习了一下linux下的shell编程,简单记录一下测试用例 1.编辑shell脚本文件如下: #!/bin/bashecho "hello bash linux"echo ...
- linux下的Shell编程(3)shell里的流程控制
if 语句 if 表达式如果条件命令组为真,则执行 then 后的部分.标准形式: if 判断命令,可以有很多个,真假取最后的返回值 then 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...
- Linux下的Shell编程(1)最简单的例子
深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一. 从第一行开始 我们可以使用任意一种文字编辑器编写shell脚本,它必须以如下行开始(必须放在文件的第一行): #!/bi ...
- 【转】Shell编程基础篇-下
[转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...
随机推荐
- 第16章-使用Spring MVC创建REST API
1 了解REST 1.1 REST的基础知识 REST与RPC几乎没有任何关系.RPC是面向服务的,并关注于行为和动作:而REST是面向资源的,强调描述应用程序的事物和名词. 为了理解REST是什么, ...
- BZOJ 2301 Problem b(莫比乌斯反演+分块优化)
Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...
- java多线程的操作
上篇博客简单了介绍了Java的多线程的概念,与进程的区别,两种创建方式,状态及获取线程名称等内容.这篇文章接着介绍Java的多线程.主要从一下几方面介绍. 1 线程类的常用方法 1.1 start() ...
- .net 特性 Attribute
public sealed class RemarkAttribute : Attribute { public string Remark { get; set; } // 构造函数 public ...
- 我用Django搭网站(2)-QQ登录
接入QQ登录前,网站需首先进行申请,获得对应的appid与appkey,以保证后续流程中可正确对网站与用户进行验证与授权. 第一步:准备阶段 打开QQ互联,并登录你的QQ账号.再点击导航上的" ...
- 国外物联网平台(4):Ayla Networks
国外物联网平台(4)——Ayla Networks 马智 定位 Ayla企业软件解决方案为全球部署互联产品提供强大的工具 功能 Ayla的IoT平台包含3个主要组成部分: (1) Ayla嵌入式代理A ...
- [raspberry p3] suse wifi驱动加载
问题 raspberry pi3安装后发现wifi 启动不了, brcmf_sdio加载失败了,return error code为-110 处理方法 打开 /etc/dracut.conf.d/ra ...
- ASP.NET伪静态配置
一.下载URLRewriter.dll 二.在项目中添加URLRewrite的引用 三.配置webconfig 1.在<configuration>节点中添加: <configSec ...
- js 去空格 和 获得字节数
function removespace(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } function getLength ...
- 七、CommonJS规范和Note.js模块概念的介绍
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多 ...