Shell 脚本案例实战 [4]

Shell脚本从入门到实战 Shell脚本 阅读详情
for循环结构
  for 循环结构语句
    1.for循环结构:
语法:
for 变量名 in 变量取值列表
do
    指令…
done
  提示:在此结构中“in 变量取值列表”可省略,省略时相当于in “$@”,使用for i 就相当于使用for i in “$@”
  2.C语言型for循环结构
for ((exp1;exp2;exp3))
do
    指令…
done
使用for循环打印1+…100的方法
[root@web02 28]# sh -v for2.sh 
module () {  eval `/usr/bin/modulecmd bash $*`
}
#!/bin/bash
for ((i=1;i<=100;i++))
do
   let sum+=i
done
echo $sum
5050
j=0
while ((j<=100))
do
    let sumj+=j
    let j++
done
echo $sumj
5050
范例10:计算从1加到100(用C语言型FOR循环实现,2种)
for((i=0;i<=100;i++))
do
    ((sum=sum+i))
done
echo $sum
i=0
while ((i<=100))
do
    ((j=j+i))
     i++
done
提示:一般的for循环和while循环可以互相转换使用,即可以实现同样的功能
例子:for和while对比
[root@db02 for]# cat for.sh
#!/bin/bash
for((i=1;i<=5;i++))
do
    echo $i
done
####################################################
i=1
while((i<=5))
do
    echo $i
    ((i++))
done
结果:
 说明:
(1)程序持续运行多用while,包括守护进程,还有配合read读入处理。
(2)有限次循环多用for,工作中for 使用更多
使用for循环打印1-5(使用for)
[root@web02 28]# sh for.sh 
1
2
3
4
5
[root@web02 28]# cat for.sh 
#!/bin/bash
for n in 1 2 3 4 5
do
   echo $n
done
第二种打印方法(使用C语言类型)
[root@web02 28]# sh for.sh 
a0
a1
a2
a3
a4
a5
a6
a7
a8
a9
a10
[root@web02 28]# cat for.sh 
#!/bin/bash
for n in {0..10}
do
   echo a$n
done

常用for例子

使用for循环打印5个ip地址
[root@db02 scripts]# sh for.sh 
10.0.0.1
10.0.0.2
10.0.0.3
10.0.0.4
10.0.0.5
[root@db02 scripts]# cat for.sh
#!/bin/bash
for n in `seq 5`
do
   echo 10.0.0.$n
done
使用for循环打印当前目录文件名
[root@db02 scripts]# cat for.sh 
#!/bin/bash
for n in `ls /server/scripts/`
do
       echo $n
done
使用for循环,生成随机数
[root@db02 test]# cat ../for.sh 
#!/bin/bash
for((i=1;i<=11;i++))
do
   mkdir -p test
    touch ./test/`echo $RANDOM|md5sum|cut -c 1-8`_finished.html
done

分库分表备份

[root@db01 scripts]# cat for4.sh 
MYUSER=root
MYPASS=oldboy123
SOCKET=/data/3306/mysql.sock
MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET"
for n in `$MYCMD -e "show databases;"|sed '1d'|egrep -v "_schema|mysql"`
do
  $MYDUMP -B $n|gzip >/tmp/${n}_$(date +%F).sql.gz
done
 实战题:开发脚本实现仅设置sshd rsyslog crond network sysstat开机自启动。
#!/bin/sh
LANG=en
for name in `chkconfig --list|grep 3:on|awk '{print $1}'`
do
  chkconfig $name off
done
for name in rsyslog network crond sshd sysstat
do
  chkconfig $name on
done

条件与循环等的控制break continue exit return

break continue exit对比
break continue exit 一般用于循环结构中控制循环(for,while,if)的走向
命令  说明
break n n  表示跳出循环的层数,如果省略n表示跳出整个循环
continue n n 表示退到第n层继续循环,如果省略n表示跳过本次循环,忽略本次循环的剩余代码,进入循环的下一次循环。
exit n

退出当前shell程序,n为返回值。n也可以省略,再下一个shell里通过$?接收这个n的值

return n 用于在函数里,作为函数的返回值,用于判断函数执行是否正确
测试:
  for((i=0; i<=5; i++))
do
  if [ $i -eq 3 ] ;then
      #continue;
      break; 
      #exit
  fi
    echo $i
done
echo "ok"
break 当i等于3 跳出 直接显示ok
continue 当i等于3  跳过3 直接显示ok。中断本次循环 
exit  当i等于3  跳出脚本
使用的脚本案例
[root@web02 28]# sh for5.sh old
[root@web02 28]# echo $?
1
[root@web02 28]# sh for5.sh oldboy
good
[root@web02 28]# echo $?
0
[root@web02 28]# cat for5.sh 
oldboy(){
if [ "$1" == "oldboy" ];then
   echo "good"
   return 0
   else
   return 1
fi
}
oldboy $1
return 用于在函数中的返回值。
[root@web02 28]# cat re.sh 
. /server/scripts/28/for5.sh
oldboy $1
if [ $? -eq 0 ];then
   echo "the string you input is [oldboy]"
   else
   echo "error"
fi
[root@web02 28]# cat for5.sh 
oldboy(){
if [ "$1" == "oldboy" ];then
   echo "good"
   return 0
   else
   return 1
fi
}
[root@web02 28]# sh re.sh 
error
[root@web02 28]# sh re.sh oldboy
good
the string you input is [oldboy]
 范例(生产场景):开发shell脚本实现给服务器临时配置多个别名IP,并可以随时撤销配置的所有IP。
     IP地址为:10.0.2.1-10.0.2.16,其中10.0.2.10不能配置。

1.自己做的。
[root@web02 28]# cat ip.sh 
#!/bin/bash
for i in {1..16}
do
   if [ $i -eq 10 ];then
   continue;
  fi
  ip addr add 10.0.2.$i dev eth0:$i label eth0:$i
done
[root@web02 28]# cat ipdel.sh 
#!/bin/bash
for i in {1..16}
do
   if [ $i -eq 10 ];then
   continue;
  fi
  ip addr del 10.0.2.$i dev eth0:$i label eth0:$i
done
2.推荐方法
[root@web02 28]# cat useradd.sh 
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
add(){
for ip in {1..16}
do
   if [ $ip -eq 10 ];then
      continue
   fi
 ip addr add 10.0.2.$ip/24 dev eth0:$ip label eth0:$ip &>/dev/null
  if [ $? -eq 0 ];then
     action "add $ip" /bin/true
     else
    action "add $ip" /bin/false
  fi
done
}
del(){
for ip in {16..1}
do
   if [ $ip -eq 10 ];then
      continue
   fi
 ip addr del 10.0.2.$ip/24 dev eth0:$ip label eth0:$ip &>/dev/null
  if [ $? -eq 0 ];then
     action "del $ip" /bin/true
     else
    action "del $ip" /bin/false
  fi
done
}
read -p "please in put {start|stop}" a
case "$a" in
  start)
    add
    RETVAL=$?
     ;;
  stop)
    del
    RETVAL=$?
    ;;
  restart)
   del
   sleep 2
   add
   ;;
  *)
  echo "Please in put {start|stop}\n"
  ;;
esac
exit $RETVAL
添加ip的结果
另一种方法:(和第二种区别不大,只是修改了传参)
[root@db02 for]# cat ip.sh 
#!/bin/sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
RETVAL=0
op(){
if [ "$1" == "del"  ] 
then
    list=`echo {16..1}`
else
    list=`echo {1..16}`
fi
for ip in $list
do
  if [ $ip -eq 10 ] 
  then
     continue
  fi
  ip addr $1 10.0.2.$ip/24 dev eth0 label eth0:$ip &>/dev/null
  if [ $? -eq 0 ]
  then
      action "$1 $ip" /bin/true
  else 
      action "$1 $ip" /bin/false
  fi
done
}
case "$1" in
 start)
    op add
    RETVAL=$?
    ;;
 stop)
    op del
    RETVAL=$?
    ;;
 restart)
    op del
    sleep 2
    op add
    RETVAL=$?
    ;;
    *)
     printf "USAGE:$0 {start|stop|restart}\n"
esac
exit $RETVAL
结果如下。
 必须会手写的shell实战案例:

1、开发shell脚本分别实现以脚本传参以及read读入的方式比较2个整数大小。用条件表达式进行判断并以屏幕输出的方式提醒用户比较结果。注意:一共是开发2个脚本。当用脚本传参以及read读入的方式需要对变量是否为数字、并且传参个数不对给予提示。
2、开发shell脚本判断系统剩余内存的大小,如果低于100M就邮件报警给管理员,并且加入系统定时任务每3分钟执行一次检查。
3、开发脚本实现仅设置sshd rsyslog crond network sysstat开机自启动。
4、计算1+2+3…+100之和(使用while,for)
Shell数组

数组介绍
    简单的说,数组就是各种数据类型的元素按一定顺序排列的集合。
数组就是把个元素变量或数据用一个名字命名。然后用编号区分它们的变量的集合。这个名字称为数组名,编号称为数组下表 。

数组定义与增删改查
方法1:array=(value1 value2 value3….)
1)数组定义
[root@db02 scripts]# array=(1 2 3)
#对括号表示是数组,数组元素用“空格”符号分隔开
2)获取数组的长度
[root@db02 scripts]# echo ${array[@]}
1 2 3
[root@db02 scripts]# echo ${array[*]}
1 2 3
#用${#数组名[@或*]} 可以得到数组长度
3)打印数组元素
[root@db02 scripts]# echo ${array[0]}
1
[root@db02 scripts]# echo ${array[1]}
2
#打印数组元素用${数组名[下标]} 下标是从0开始
数组案例
把下面URL定义为数组元素并打印如下元素
http://www.taobao.com 
http://oldboy.blog.51cto.com
http://10.0.0.7
脚本内容如下
[root@db02 scripts]# cat array.sh 
#!/bin/bash
array=(
http://www.etiantian.org
http://www.taobao.com 
http://oldboy.blog.51cto.com
http://10.0.0.7
)
for i in ${array[*]}
do
    echo $i
done
 提示:数组也是变量,因此也适合于前面讲解过的变量的子串处理的功能应用。
参考:
man bash然后搜Arrays
数组的定义:
 方法1:array=( value1 value2 value3 … )
 方法2:array=([1]=one [2]=two [3]=three)   <==key-value键值对
 方法3:array[0]=a array[1]=b array[2]=c
 方法4:array=($(ls))
 方法1 和方法4是常用方法
数组实践实战例子
批量检查多个网站地址是否正常 
要求:
1、shell数组方法实现,检测策略尽量模拟用户访问。
2、每10秒钟做一次所有的检测,无法访问的输出报警。
3、待检测的地址如下
http://www.etiantian.org
http://www.taobao.com 
http://oldboy.blog.51cto.com
http://10.0.0.7
分步实现:
1、把URL定义成数组,然后while打印出来。
2、编写URL检查脚本。
3、组合实现整个案例。

第一步:循环打印出URL
#!/bin/bash
 . /etc/init.d/functions
array=(
http://www.etiantian.org
http://www.taobao.com
http://oldboy.blog.51cto.com
http://10.0.0.7
)
for((i=0;i<${#array[*]};i++))
do
   echo ${array[i]}
done
第二步:进行命令的拼接
for((i=0;i<${#array[*]};i++))
do
  ret=`curl -I -s ${array[i]}|egrep "200|302"|wc -l`
  if [ $ret -eq 1 ];then
   action "`echo ${array[i]}|awk -F "/" '{print $3}'` is ok" /bin/true
  else
   action "`echo ${array[i]}|awk -F "/" '{print $3}'` is not ok" /bin/false
  echo `echo ${array[i]} is not ok|mail -s "$(date +%F-%S)warning" new_oldboy@163.com`
  fi
done
执行结果:
 另一种方法:此方法运用了函数(由老男孩28期李啸宇提供)
[root@db02 scripts]# cat arra.sh
#!/bin/sh
. /etc/init.d/functions
cat >/tmp/a.txt<<EOF
http://www.etiantian.org
http://www.taobao.com 
http://oldboy.blog.51cto.com
http://10.0.0.7
EOF
print_line(){
arr=($(cat /tmp/a.txt))
for i in ${arr[@]}
do
   echo $i
done
}
limit_time(){
echo "倒计时:"
for i in `seq 20 -1 1`
do
   echo -ne ">"
   sleep 1
   echo -ne "\b-"
done
   echo -ne ">"
   echo ""
}
ping_line(){
while true
do
arr=($(cat /tmp/a.txt))
for i in ${arr[@]}
do
   curl $i &>/dev/null
   if [ $? -eq 0 ]
   then
     action "$i is OK" /bin/true
   else
     action "$i is FALSE" /bin/false
   fi
done
limit_time
done
}
main(){
print_line
ping_line
}
main
执行结果:
 生成倒计时的脚本:
[root@web02 28]# cat 111.sh 
limit_time(){
echo "倒计时:"
for i in `seq 20 -1 1`
do
   echo -ne ">"
   sleep 1
   echo -ne "\b-"
done
   echo -ne ">"
   echo ""
}
limit_time
检测URL方法:
第一种:看返回值
curl -I -s --connect-timeout 3 http://oldboy.blog.51cto.com|head -1|egrep -w "200|301|302" &>/dev/null
echo $?
第二种:转成行数
curl -I -s --connect-timeout 3 http://oldboy.blog.51cto.com|head -1|egrep -w "200|301|302"|wc -l
第三种:
wget -T 3 --spider --tries=2 http://oldboy.blog.51cto.com &>/dev/null
echo $?
老男孩老师推荐方法:
[root@db02 scripts]# cat aaa.sh 
#!/bin/sh
################
#Author:YuHongCong
#604419314@qq.com
################
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
URLS=(
http://www.etiantian.org
http://www.taobao.com 
http://oldboy.blog.51cto.com
http://10.0.0.70
)
CHECK_URL(){
  wget -T 3 --spider --tries=2 $1 &>/dev/null
  if [ $? -eq 0 ]
  then
    return 0
  else
    return 1
  fi
}
MON_URL(){
for url in ${URLS[*]}
do
  CHECK_URL $url
  if [ $? -eq 0 ]
  then
    action "$url" /bin/true
  else
    action "$url" /bin/false
  fi
done
}
main(){
while true
do
  MON_URL
  sleep 10
done
}
main
执行结果:
 老男孩推荐:(包含倒计时的方法)
[root@db01 shizhan]# cat oldboy01.sh   
#!/bin/sh
################
#Author:oldboy
#31333741@qq.com
################
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
URLS=(
http://www.etiantian.org
http://www.taobao.com 
http://oldboy.blog.51cto.com
http://10.0.0.70
)
LTIME(){
echo -n "time;"
for n in {1..10}
do
  if [ $n -eq 10 ]
   then
    echo "start"
  else
    echo -n .
  fi
  sleep 1
done
}
CHECK_URL(){
  wget -T 3 --spider --tries=2 $1 &>/dev/null
  if [ $? -eq 0 ]
  then
    return 0
  else
    return 1
  fi
}
MON_URL(){
for url in ${URLS[*]}
do
  CHECK_URL $url
  if [ $? -eq 0 ]
  then
    action "$url" /bin/true
  else
    action "$url" /bin/false
  fi
done
}
main(){
while true
do
  LTIME
  MON_URL
  sleep 10
done
}
main
企业案例:打印下面这具有中字母数不大于6的单词
I am oldboy teacher welcome to oldboy training class.
没讲数组之前自己做的:
[root@web02 ~]# cat /server/scripts/28/bash.sh 
#!/bin/bash
for n in `echo I am oldboy teacher welcome to oldboy training class.`
do
AAA=$( echo $n|wc -c)
if [ $AAA -gt 7 ];then
     continue;  
fi
echo $n
done
第一种方法:不使用数组
[root@db02 scripts]# cat 3.sh 
#!/bin/bash
for i in I am oldboy teacher welcome to oldboy training class.
do
   if [ "${#i}" -le 6 ]
     then
        echo $i
   fi
done
第二种方法:使用数组
[root@db02 scripts]# cat 3.sh 
#!/bin/bash
array=(I am oldboy teacher welcome to oldboy training class.)
for ((i=0;i<${#array[@]};i++))
do
   if [ "`echo ${array[i]}|wc -L`" -le 6 ]
   then
       echo ${array[i]}
   fi
done
第三种方法:命令拼接
echo "I am oldboy teacher welcome to oldboy training class." | awk '{for(i=1;i<=NF;i++){a=length($i);if(a <= 6){print $i}}}'
使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,名称例如为:
1
2
3
4
5
6
[root@oldboy oldboy]# sh /server/scripts/oldboy.sh
[root@oldboy oldboy]# ls 
coaolvajcq_oldboy.html  qnvuxvicni_oldboy.html  vioesjmcbu_oldboy.html
gmkhrancxh_oldboy.html  tmdjormaxr_oldboy.html  wzewnojiwe_oldboy.html
jdxexendbe_oldboy.html  ugaywanjlm_oldboy.html  xzzruhdzda_oldboy.html
qcawgsrtkp_oldboy.html  vfrphtqjpc_oldboy.html
生成10位全小写密码方法
方法1:通过系统环境变量($RANDOM)
[root@db02 ~]# echo $RANDOM
8757
[root@db02 ~]# echo $RANDOM
28279
[root@db02 ~]# echo $RANDOM
22845
man bash 可查帮助随机数范围0-32767
方法2:通过openssl产生随机数
[root@db02 ~]# openssl rand -base64 10
S5IS1GhPchOFPw==
[root@db02 ~]# openssl rand -base64 10
Jj2X/g/FyJZqvQ==
因为可能会有大小写以及特殊符号,所以此方法不建议使用
方法3:通过时间生成
[root@db02 ~]# date +%s%N|cut -c 1-10
1469013457
[root@db02 ~]# date +%s%N|cut -c 1-10|tr "[0-9]" "[a-z]"
begjabdehb
[root@db02 ~]# date +%s%N|cut -c 1-10|tr "[0-9]" "[a-z]"
begjabdehe
方法4:系统生成
[root@db02 ~]# head /dev/urandom |cksum
4209252634 2257
[root@db02 ~]# head /dev/urandom |cksum|cut -c 1-10
1779036536
[root@db02 ~]# head /dev/urandom |cksum|cut -c 1-10|tr "[0-9]" "[a-z]"
diifejgbdf
[root@db02 ~]# head /dev/urandom |cksum|cut -c 1-10|tr "[0-9]" "[a-z]"
bgdjgfagfe
方法5:UUID生成
    UUID格式是:包含32个16进位数字,以“-”连接号分为五段,形式为8-4-4-4-12的32个字符。UUID理论上的总数为216×8=2128,约等于3.4×1038,也就是说若每秒产生1兆个UUID,要花100亿年才会将所有UUID用完
[root@db02 ~]# cat /proc/sys/kernel/random/uuid 
0849fa26-7060-4dbe-a3db-818b5b9cdc62
[root@db02 ~]# cat /proc/sys/kernel/random/uuid 
8696f3eb-c092-4692-a1ad-b7de23885252
方法6 :使用mkpasswd专用生成工具(需安装)
[root@db02 ~]# yum install expect -y
[root@db02 ~]# mkpasswd -l 8
hxL1aG7/
[root@db02 ~]# mkpasswd -l 8
2VU(t1qb
[root@db02 ~]# mkpasswd -l 8
pJ0{H5vx
   用法:mkpasswd(args)[用户]
  参数:
  - l #(密码的长度,默认= - c)
  - d #(min #数字,默认= 2)
  - c #(min #的小写字符,默认= 2)
  - c #(min #大写字符,默认= 2)
  - s #(min #的特殊字符,默认= 1)
  - v(详细显示passwd交互)
  - p学监(程序设置密码,默认= passwd)
 mkpasswd -l 10 -C 0 -d 0 -s 0
方法7:使用awk生成(用处不大)
[root@db02 ~]# awk 'BEGIN{srand();for(j=0;j<2;j++){for(i=0;i<10;i++){printf("%c",rand()*10+97)}print}}'
fhbcgdaifd
bebcebdgch
生成文件
方法1:
 #!/bin/sh
dir=/oldboy
for n in {1..10}
do
  [ ! -d $dir ] && mkdir $dir
  touch $dir/$(mkpasswd -l 10 -C 0 -d 0 -s 0)_oldboy.html
done
方法2:
[ -d /oldboy ] || mkdir /oldboy
i=0
while ((i < 10))
do
  ((i++))
  for n in `mkpasswd -C 0 -d 0 -s 0`
  do
     touch /oldboy/${n}_oldboy.html
  done
done
将文件名中包含oldboy全部修改为oldgirl,并且html改成大写
 [root@db01 shizhan]# cat oldboy04.sh
#!/bin/sh
dir=/oldboy
[ -d $dir ]||mkdir -p $dir
cd $dir
for file in `ls *.html`
do
  mv $file `echo $file|sed -e 's#oldboy#oldgirl#g;s#html#HTML#g'`
done
 还可以使用rename
[root@db01 oldboy]# rename "oldgirl" "oldboy" *.HTML
[root@db01 oldboy]# rename "HTML" "html" *.HTML               
[root@db01 oldboy]# ls -l
总用量 0
-rw-r--r-- 1 root root 0 7月  15 18:02 oldboy_ammkzjlpku.html
-rw-r--r-- 1 root root 0 7月  15 18:02 oldboy_biedqiinlp.html
-rw-r--r-- 1 root root 0 7月  15 18:02 oldboy_dkyhxztemc.html
-rw-r--r-- 1 root root 0 7月  15 18:02 oldboy_euccgeydmq.html
-rw-r--r-- 1 root root 0 7月  15 18:02 oldboy_mrhwpsssqk.html
-rw-r--r-- 1 root root 0 7月  15 18:02 oldboy_sueeqfnxsc.html
-rw-r--r-- 1 root root 0 7月  15 18:02 oldboy_uymykndtei.html
-rw-r--r-- 1 root root 0 7月  15 18:02 oldboy_wwmdvnniww.html
-rw-r--r-- 1 root root 0 7月  15 18:02 oldboy_xjqjkgxpew.html
-rw-r--r-- 1 root root 0 7月  15 18:02 oldboy_zuegqfjdsw.html
案例:批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)。
[root@db02 ~]# cat 3.sh
#!/bin/sh
[ -f /etc/init.d/functions ]&& source /etc/init.d/functions
[ $UID -ne 0 ]&&{
  echo "Ples sudo su - root"
  exit 1
}
for user in gongli{01..10}
do 
  word=$(grep "\b$user\b" /etc/passwd|wc -l)
  if [ $word -eq 1 ];then
     action "Useradd $user already exists" /bin/false
     continue
  fi
  pass=$(echo $RANDOM|md5sum|cut -c 1-8)
  useradd $user &&\
  echo "$user:$pass"|tee >>/tmp/userlist.log
done
chpasswd < /tmp/userlist.log
比第一种加了一个正确选项
[root@db02 ~]# cat add.sh
#!/bin/sh
[ -f /etc/init.d/functions ]&& source /etc/init.d/functions
[ $UID -ne 0 ]&&{
  echo "Ples sudo su - root"
  exit 1
}
for user in xu{01..10}
do 
  word=$(grep "\b$user\b" /etc/passwd|wc -l)
  if [ $word -eq 1 ];then
     action "Useradd $user already exists" /bin/false
     continue
  fi
  pass=$(echo  $RANDOM|md5sum|cut -c 1-8)
  useradd $user && \
  echo "$pass"|passwd --stdin $user &>/dev/null
  RETVAL=$?
  if [ $RETVAL -eq 0 ];then
     action "Useradd $user IS OK" /bin/true
  fi
 echo -e "$user\t$pass" >>/tmp/user.txt
done
测试结果:
企业常见面试题:
已知下面的字符串是通过RANDOM随机数变量md5sum|cut-c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字?
21029299
00205d1c
a3da1677
1f6d12dd
890684b
方法一:
 #!/bin/bash
. /etc/init.d/functions
MD5PASS=(
21029299
00205d1c
a3da1677
1f6d12dd
890684b
)
for ((n=0;n<=32767;n++))
do
for((i=0;i<${#MD5PASS[*]};i++))
do
        md5=`echo $n | md5sum|cut -c 1-8`
        if [ "$md5" == ${MD5PASS[$i]} ]
                then
                echo "$n" "${MD5PASS[$i]} "
                fi
done
done
方法二:
 [root@openvpn-server ~]# cat md5sum.sh
#!/bin/sh
a=(
21029299
00205d1c
a3da1677
1f6d12dd
890684b
)
for i in `seq 32767`
do
   source=`echo $i|md5sum|cut -c 1-8`
   for j in ${a[@]}
   do
   if [ $source == $j ];then
      echo $source "-->" $i
   fi
   done
done
方法3:
 [root@m01 ~]# cat mianshiti6.sh 
#!/bin/bash
mima=(
21029299
00205d1c
a3da1677
1f6d12dd
890684b
)
for i in {1..32767}
 do
  num=`echo $i | md5sum | cut -c -8`
  for n in ${mima[*]}
   do
    if [ "$num" == "$n"  ]
     then
      echo "$i match $n"
      continue 
    fi
  done
done


shell脚本实战 | 6个入门级shell脚本(CPU负载、监控、计划任务) shell脚本博大精深,本文只起到一个抛砖引玉的作用。 案例主要介绍: CPU负载、监控内存使用、磁盘使用、以及计划任务的使用、系统预定义变量的使用等。 阅读详情

相关推荐

shell脚本保姆级教程,附赠100个shell脚本案例!

无论是系统运维,还是应用运维,均可分为“**纯手工”—> “脚本化”—> “自动化”—>“智能化”**几个阶段,其中自动化阶段,主要是将一些重复性人工操作和运维经验封装为程序或脚本,一方面避免重复性操作及风险,另一方面提高执行效率。 在自动化运维的转变过程中,经常使用的可能就是shell脚本了。 很多人认为shell脚本简单,但其实Shell的小脚本却有大智慧。别小看几十行代码,它夹杂着系统设计、代码规范和操作经验等等细节,在建设自动化运维的工作中,还是很值得我们研究学习的。 为了帮助大.

weixin_43507410的博客 2917

shell脚本案例30个带详细解析

案例一:输入网卡的名字,来输出网卡的IP 1.问题: 1.)参数后判断要加“” 2.)名字为空时显示ip 2.分析: ) 把本机的所有网卡名列出来,来引导用户输入。 ) 使用命令列出所有网卡信:ifconfig ) 设计一个函数,把网卡名作为参数,函数返回网卡的IP ) 在获取某个网卡IP时,考虑网卡有多个IP地址(或为空IP的网卡) 3.流程图: 4.实现: 5.实现解析: ) egrep awk,反复运行和推敲命令,来分析执行结果 ) 死循环。当输入错误或者为空,继续输入–>输入正确。

别散的博客 1万+

【shell】shell脚本实战-shell脚本函数详解

echo “我是高胜寒1!gaosh () {echo “我是高胜寒2!shgaosh。

m0_54816834的博客 819

毕业一年,从事运维感觉没有出路,如何转型更有前景?

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

Python_0011的博客 2549

linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]

文章目录shell 入门到实战详解[⭐建议收藏!!⭐]关于作者**作者介绍**一、shell 入门简介1.1 什么是shell1.2 shell 编程注意事项1.3 第一个shell 脚本 hello world二、shell 环境变量讲解2.1 shell 变量详解2.2 shell 系统变量 介绍2.3 shell 环境变量 介绍2.3.1 常见的系统环境变量2.4 shell 用户环境变量 介绍2.4.1 自定义shell环境变量2.4.2 echo 打印菜单栏2.4.3 shell 中彩色输出 h

心有鸿鹄天地,不敢妄坠人间 33万+

循序渐进学运维-shell脚本实战专栏

前言 shell脚本的基础知识已经更新完毕,学会了基础知识并不代表学会了shell脚本,所以后期我会给大家一些案例,这些案例会放在《shell脚本天天练》系列里。 shell脚本实战目录 【Linux】shell脚本概述 【Linux】shell脚本基础-变量 【Linux】shell脚本实战-使用shell进行数学运算 【Linux】shell脚本实战-各类运算符介绍 【Linux】shell脚本实战-if单双分支条件语句详解 【Linux】shell脚本实战-if多分支条件语句详解 【Linux】she

互联网老辛 6119

一些简单的shell脚本实例

(1)用户猜数字 #!/bin/bash # 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了, # 猜小了或猜大了,直至用户猜对脚本结束。 # RANDOM 为系统自带的系统变量,值为 0‐32767的随机数 # 使用取余算法将随机数变为 1‐100 的随机数 num=$[RANDOM%100+1] echo "$num" # 使用 read ...

喜欢历史的码农 2万+

【shell项目实战】 日志删除

日志删除 删除日志要求 1.定期删除/data目录下修改时间大于7天的日志文件 2.定期删除/data/YY-MM-DD.tar.gz 该目录仅工作日自动生成YY-MM-DD.tar.gz文件 希望只保留最近2天的文件 无论节假日/data仍只会保留前2个工作日文件 1.定期删除大于2天的日志 linux中修改时间用-mtime [klaus@localhost project]$ ll data/ total 0 -rw-rw-r--. 1 klaus klaus 0 Feb 13 00:00 2020-02-13.txt -rw-rw-r--. 1 klaus klaus 0 Feb 14

10 个拿来就用的 Shell 脚本实例!

10 个拿来就用的 Shell 脚本实例!

欢迎朋友,我是一名十多年开发经验的新手,希望多多指教。 2733

音频测试专题

麦克风与扬声器单体测试指标及整机性能测试概述 麦克风测试指标包括频率响应、灵敏度、指向性等10项关键参数,用于评估声音捕捉和信号转换性能。扬声器测试包含频率响应、灵敏度等12项指标,涉及声学特性和物理参数。整机性能测试覆盖安静、嘈杂和正常三种环境,重点检测麦克风底噪、清晰度、扬声器音量及通话质量等12项功能指标。两类单体测试与整机测试共同构成完整的音频设备质量评估体系,确保产品在不同场景下的性能表现。

weixin_52640906的博客 1315

STM32F030F4P6 ADC多通道定时器触发DMA搬运

主函数中等待转换完成的标志位,然后打印出来。ADC回调函数中将数值赋值给变量。配置定时器1s读一次。

qq_24426625的博客 1355

Shell脚本案例大全

13、Nginx访问日志自动按天(周、月)切割。12、Nginx访问日志分析。

li175325的博客 5701

一种基于改进YOLOv8并与ORB-SLAM3融合的动态环境密集点云同步定位与建图(SLAM)方法

文章提出了一种基于改进 YOLOv8 与 ORB-SLAM3 融合的动态环境稠密点云 SLAM 方法,通过引入GSConv 卷积模块和VoVGSCSP 特征融合模块优化 YOLOv8 的轻量性,结合实时目标检测与语义分割技术去除动态特征点,显著提升了动态场景下的位姿估计精度。

2401_87345388的博客 1937

Shell运维实战4-数组与脚本开发规范、企业级案例展示

shell运维开发实战第四篇

delete_you的博客 1357

5分钟搞定SNMP工具安装:从Linux到Windows的snmpwalk/snmpget全攻略

本文提供了SNMP工具(snmpwalk/snmpget)在Linux和Windows系统上的快速安装与使用指南,涵盖从基础安装到高阶应用的全面解析。通过详细的命令示例和故障排查技巧,帮助用户快速掌握网络设备监控与诊断的核心技能,提升运维效率。

weixin_29248313的博客 552

ISCE2+MintPy环境搭建实战:用Anaconda五分钟搞定InSAR处理全家桶

本文提供了一份详细的ISCE2+MintPy环境安装教程,旨在帮助InSAR处理初学者快速搭建开发环境。通过使用Anaconda创建虚拟环境并配置国内镜像,用户可在五分钟内一键安装ISCE2和MintPy全家桶,有效解决依赖冲突和版本兼容性问题,让用户能专注于数据处理本身。

2y3u4i5o6p的博客 1003

linux运维脚本编写,最强Linux自动化运维 Shell高级脚本编程实战 带习题+项目实战案例+全套配置脚本...

最强Linux自动化运维 Shell高级脚本编程实战 带习题+项目实战案例+全套配置脚本大家可以通过参考下面的课程学习目录,就会发现单单只从目录上来分析就知道这是一部非常系统的Shell自动化脚本运维实战课程,课程有非常系统全面的Shell技术讲解,并且有配套的学习案例进行辅助,还有很多相关的练习题让大家更容易掌握和理解,最后还有很关键的Shell项目案例学习,这部分的帮助确实很大。课程还给大家附...

weixin_42137028的博客 200

泛微ecology9 利用字段值动态控制明细表显示与隐藏

本文详细介绍了在泛微ecology9中,如何利用WfForm.bindFieldChangeEvent监听字段变化,结合jQuery动态控制明细表显示与隐藏的实战方法。通过五步操作,可实现根据字段值(如报销类型)智能切换明细表,提升表单交互体验与开发效率,并确保PC与移动端完美兼容。

7z8x2c4v6b9的博客 585

linux shell 脚本教程

查找字符串:用于查找字符的位置,输出结果为字符在字符串中所占的数据位置,如果查找多个字符,那哪个字母先出现就计算哪个,如下查找it中i和t两个字符,t先出现,输出为1。你可以直接在终端中使用此命令,但在本测试中,你将通过 shell 脚本运行此命令。如果你想从任何地方运行你的 bash 脚本,就像它是一个常规的 Linux 命令,需要将你的 shell 脚本的位置添加到 PATH 变量中。环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,必要的时候shell脚本也可以定义环境变量。

9457

华为OD机考双机位C卷 - 采购订单 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 采购订单 。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 426

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Linux shell脚本实战案例

Linux shell脚本实战案例

qqrrjj2011的博客 1507

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Shell脚本综合实战案例

Shell脚本综合实战案例 前言 实验环境 VMware Workstation 15 centos7虚拟机若干台 1.案例一: 1.需求描述 1.1编写名为system.sh的小脚本,记录局域网中各主机的MAC地址,保存到/etc/ethers文件中;若是文件已存在,应先转移进行备份;每行一条记录,第一列为IP地址,第二列为对应的MAC地址 1.2检查有哪些主机开启了FTP服务,扫描对象为/et...

double_happy111的博客 1251

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

30个Linux Shell脚本经典案例(上)

在学习Linux运维时,普遍反馈是:Linux Shell是一个很难的知识板块。虽然大家都认真学,基本的语法也都掌握了,但有需求时,很难直接上手编程,要么写了很久,要么写不好! 也有很多做运维很多年的朋友也是如此,Shell脚本一直写的不6!在网上看例子能照猫画虎写出来,完全独立写就困难了。对于初学者而言,因为没有实战经验,写不出来Shell脚本很正常,如果工作了几年的运维老年还是写不出来,那就...

liujinwei2005的专栏 9137

linux shell 脚本入门到实战

shell脚本学习

qq_44861892的博客 1090
上一篇: 深度优化LNMP之MySQL
下一篇: 深度优化LNMP之PHP
linuxlsq
博客等级 码龄11年 69粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值