本文目录

  1. 21、从FTP服务器下载文件
  2. 22、连续输入5100以内的数字,统计和、最小和最大
  3. 23、将结果分别赋值给变量
  4. 24、批量修改文件名
  5. 25、统计当前目录中以.html结尾的文件总大
  6. 26、扫描主机端口状态
  7. 27Expect实现SSH免交互执行命令
  8. 28、批量修改服务器用户密码
  9. 29、打印乘法口诀
  10. 30getopts工具完善脚本命令行参数
21、从FTP服务器下载文件
  1. #!/bin/bash
  2. if [ $# -ne 1 ]; then
  3. echo "Usage: $0 filename"
  4. fi
  5. dir=$(dirname $1)
  6. file=$(basename $1)
  7. ftp -n -v << EOF # -n 自动登录
  8. open 192.168.1.10 # ftp服务器
  9. user admin password
  10. binary # 设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式错误
  11. cd $dir
  12. get "$file"
  13. EOF
22、连续输入5个100以内的数字,统计和、最小和最大
  1. #!/bin/bash
  2. COUNT=1
  3. SUM=0
  4. MIN=0
  5. MAX=100
  6. while [ $COUNT -le 5 ]; do
  7. read -p "请输入1-10个整数:" INT
  8. if [[ ! $INT =~ ^[0-9]+$ ]]; then
  9. echo "输入必须是整数!"
  10. exit 1
  11. elif [[ $INT -gt 100 ]]; then
  12. echo "输入必须是100以内!"
  13. exit 1
  14. fi
  15. SUM=$(($SUM+$INT))
  16. [ $MIN -lt $INT ] && MIN=$INT
  17. [ $MAX -gt $INT ] && MAX=$INT
  18. let COUNT++
  19. done
  20. echo "SUM: $SUM"
  21. echo "MIN: $MIN"
  22. echo "MAX: $MAX"

23、将结果分别赋值给变量
  1. 应用场景:希望将执行结果或者位置参数赋值给变量,以便后续使用。
  2.  
  3. 方法1
  4.  
  5. for i in $(echo "4 5 6"); do
  6. eval a$i=$i
  7. done
  8. echo $a4 $a5 $a6
  9. 方法2:将位置参数192.168.1.1{1,2}拆分为到每个变量
  10.  
  11. num=0
  12. for i in $(eval echo $*);do #eval将{1,2}分解为1 2
  13. let num+=1
  14. eval node${num}="$i"
  15. done
  16. echo $node1 $node2 $node3
  17. # bash a.sh 192.168.1.1{1,2}
  18. 192.168.1.11 192.168.1.12
  19. 方法3
  20.  
  21. arr=(4 5 6)
  22. INDEX1=$(echo ${arr[0]})
  23. INDEX2=$(echo ${arr[1]})
  24. INDEX3=$(echo ${arr[2]})
24、批量修改文件名
  1. 示例:
  2.  
  3. # touch article_{1..3}.html
  4. # ls
  5. article_1.html article_2.html article_3.html
  6. 目的:把article改为bbs
  7.  
  8. 方法1
  9.  
  10. for file in $(ls *html); do
  11. mv $file bbs_${file#*_}
  12. # mv $file $(echo $file |sed -r 's/.*(_.*)/bbs\1/')
  13. # mv $file $(echo $file |echo bbs_$(cut -d_ -f2)
  14. done
  15. 方法2
  16.  
  17. for file in $(find . -maxdepth 1 -name "*html"); do
  18. mv $file bbs_${file#*_}
  19. done
  20. 方法3
  21.  
  22. # rename article bbs *.html
25、统计当前目录中以.html结尾的文件总大
  1. 方法1
  2.  
  3. # find . -name "*.html" -exec du -k {} \; |awk '{sum+=$1}END{print sum}'
  4.  
  5. 方法2
  6.  
  7. for size in $(ls -l *.html |awk '{print $5}'); do
  8. sum=$(($sum+$size))
  9. done
  10. echo $sum
26、扫描主机端口状态
  1. #!/bin/bash
  2. HOST=$1
  3. PORT="22 25 80 8080"
  4. for PORT in $PORT; do
  5. if echo &>/dev/null > /dev/tcp/$HOST/$PORT; then
  6. echo "$PORT open"
  7. else
  8. echo "$PORT close"
  9. fi
  10. done
27、Expect实现SSH免交互执行命令
  1. Expect是一个自动交互式应用程序的工具,如telnetftppasswd等。
  2.  
  3. 需先安装expect软件包。
  4.  
  5. 方法1EOF标准输出作为expect标准输入
  6.  
  7. #!/bin/bash
  8. USER=root
  9. PASS=123.com
  10. IP=192.168.1.120
  11. expect << EOF
  12. set timeout 30
  13. spawn ssh $USER@$IP
  14. expect {
  15. "(yes/no)" {send "yes\r"; exp_continue}
  16. "password:" {send "$PASS\r"}
  17. }
  18. expect "$USER@*" {send "$1\r"}
  19. expect "$USER@*" {send "exit\r"}
  20. expect eof
  21. EOF
  22. 方法2
  23.  
  24. #!/bin/bash
  25. USER=root
  26. PASS=123.com
  27. IP=192.168.1.120
  28. expect -c "
  29. spawn ssh $USER@$IP
  30. expect {
  31. \"(yes/no)\" {send \"yes\r\"; exp_continue}
  32. \"password:\" {send \"$PASS\r\"; exp_continue}
  33. \"$USER@*\" {send \"df -h\r exit\r\"; exp_continue}
  34. }"
  35. 方法3:将expect脚本独立出来
  36.  
  37. 登录脚本:
  38.  
  39. # cat login.exp
  40. #!/usr/bin/expect
  41. set ip [lindex $argv 0]
  42. set user [lindex $argv 1]
  43. set passwd [lindex $argv 2]
  44. set cmd [lindex $argv 3]
  45. if { $argc != 4 } {
  46. puts "Usage: expect login.exp ip user passwd"
  47. exit 1
  48. }
  49. set timeout 30
  50. spawn ssh $user@$ip
  51. expect {
  52. "(yes/no)" {send "yes\r"; exp_continue}
  53. "password:" {send "$passwd\r"}
  54. }
  55. expect "$user@*" {send "$cmd\r"}
  56. expect "$user@*" {send "exit\r"}
  57. expect eof
  58. 执行命令脚本:写个循环可以批量操作多台服务器
  59.  
  60. #!/bin/bash
  61. HOST_INFO=user_info.txt
  62. for ip in $(awk '{print $1}' $HOST_INFO)
  63. do
  64. user=$(awk -v I="$ip" 'I==$1{print $2}' $HOST_INFO)
  65. pass=$(awk -v I="$ip" 'I==$1{print $3}' $HOST_INFO)
  66. expect login.exp $ip $user $pass $1
  67. done
  68. Linux主机SSH连接信息:
  69.  
  70. # cat user_info.txt
  71. 192.168.1.120 root 123456
28、批量修改服务器用户密码
  1. Linux主机SSH连接信息:旧密码
  2.  
  3. # cat old_pass.txt
  4. 192.168.18.217 root 123456 22
  5. 192.168.18.218 root 123456 22
  6. 内容格式:IP User Password Port
  7.  
  8. SSH远程修改密码脚本:新密码随机生成
  9. https://www.linuxprobe.com/books
  10. #!/bin/bash
  11. OLD_INFO=old_pass.txt
  12. NEW_INFO=new_pass.txt
  13. for IP in $(awk '/^[^#]/{print $1}' $OLD_INFO); do
  14. USER=$(awk -v I=$IP 'I==$1{print $2}' $OLD_INFO)
  15. PASS=$(awk -v I=$IP 'I==$1{print $3}' $OLD_INFO)
  16. PORT=$(awk -v I=$IP 'I==$1{print $4}' $OLD_INFO)
  17. NEW_PASS=$(mkpasswd -l 8) # 随机密码
  18. echo "$IP $USER $NEW_PASS $PORT" >> $NEW_INFO
  19. expect -c "
  20. spawn ssh -p$PORT $USER@$IP
  21. set timeout 2
  22. expect {
  23. \"(yes/no)\" {send \"yes\r\";exp_continue}
  24. \"password:\" {send \"$PASS\r\";exp_continue}
  25. \"$USER@*\" {send \"echo \'$NEW_PASS\' |passwd --stdin $USER\r exit\r\";exp_continue}
  26. }"
  27. done
  28. 生成新密码文件:
  29.  
  30. # cat new_pass.txt
  31. 192.168.18.217 root n8wX3mU% 22
  32. 192.168.18.218 root c87;ZnnL 22
29、打印乘法口诀
  1. 方法1
  2.  
  3. # awk 'BEGIN{for(n=0;n++<9;){for(i=0;i++<n;)printf i"x"n"="i*n" ";print ""}}'
  4. 方法2
  5.  
  6. for ((i=1;i<=9;i++)); do
  7. for ((j=1;j<=i;j++)); do
  8. result=$(($i*$j))
  9. echo -n "$j*$i=$result "
  10. done
  11. echo
  12. done
30、getopts工具完善脚本命令行参数
  1. getopts是一个解析脚本选项参数的工具。
  2.  
  3. 命令格式:getopts optstring name [arg]
  4.  
  5. 初次使用你要注意这几点:
  6.  
  7. 脚本位置参数会与optstring中的单个字母逐个匹配,如果匹配到就赋值给name,否则赋值name为问号;
  8.  
  9. optstring中单个字母是一个选项,如果字母后面加冒号,表示该选项后面带参数,参数值并会赋值给OPTARG变量;
  10.  
  11. optstring中第一个是冒号,表示屏蔽系统错误(test.sh: illegal option -- h);
  12.  
  13. 允许把选项放一起,例如-ab
  14.  
  15. 下面写一个打印文件指定行的简单例子,引导你思路:
  16.  
  17. #!/bin/bash
  18. while getopts :f:n: option; do
  19. case $option in
  20. f)
  21. FILE=$OPTARG
  22. [ ! -f $FILE ] && echo "$FILE File not exist!" && exit
  23. ;;
  24. n)
  25. sed -n "${OPTARG}p" $FILE
  26. ;;
  27. ?)
  28. echo "Usage: $0 -f -n "
  29. echo "-f, --file specified file"
  30. echo "-n, --line-number print specified line"
  31. exit 1
  32. ;;
  33. esac
  34. done

根据工作经验总结的30个Shell脚本案例至此完结,都还是比较实用的,面试笔试题也经常会出。希望朋友们多动手练一练,让你的Shell功底上升一个段位!

30个关于Shell脚本的经典案例(下)的更多相关文章

  1. 30个关于Shell脚本的经典案例(上)

    对于初学者而言,因为没有实战经验,写不出来Shell脚本很正常,如果工作了几年的运维老年还是写不出来,那就是没主动找需求,缺乏练习,缺乏经验.针对以上问题,总结了30个生产环境中经典的Shell脚本, ...

  2. 30个关于Shell脚本的经典案例(中)

    本文目录 11.iptables自动屏蔽访问网站频繁的IP 12.判断用户输入的是否为IP地址 13.判断用户输入的是否为数字 14.给定目录找出包含关键字的文件 15.监控目录,将新创建的文件名追加 ...

  3. shell脚本仅列出当前目录下的文件及文件夹

    #!/bin/bash function ergodic(){ ` # do # "/"$file ] # then # ergodic $"/"$file # ...

  4. shell脚本 批量转换目录下文件编码

    发布:JB01   来源:脚本学堂     [大 中 小] 分享一例shell脚本,实现可以批量转换目录下的文件编码,很实用的一个小shell,有需要的朋友参考下.原文地址:http://www.jb ...

  5. Linux Shell脚本在service模式下的环境变量

    普通Shell脚本在终端下运行时,环境变量来自于init/profile/.bash_profile等,就是在当前终端下可以得到的环境,比如PATH.在service模式下,脚本运行在受限的环境中:比 ...

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

    编写Shell过程中注意事项: 开头加解释器:#!/bin/bash 语法缩进,使用四个空格:多加注释说明. 命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 默认变量是全局的 ...

  7. 多级菜单系统安装维护shell脚本实现企业级案例

    演示效果: 1.一级菜单 2.二级菜单 3.执行操作 脚本参考: #!/bin/bash #author lic(oldboy linux student) #date 1304 DISK_NO=&q ...

  8. shell脚本编程测试类型下

    一bash的数值测试 -v VAR变量VAR是否设置 数值测试:-gt 是否大于greater-ge 是否大于等于-eq 是否等于-ne 是否不等于  not equal-lt 是否小于-le 是否小 ...

  9. shell脚本杀掉指定进程下所有子进程(包括子进程的子进程)

    搜索了网上好像并没有杀掉指定进程下所有子进程(包括子进程的子进程)的脚本,自己琢磨写了一版,虽说比较简单,但希望分享大家,帮助需要的人 #!/bin/sh # 递归找到进程最底层子进程并杀除. mai ...

随机推荐

  1. 运行时异常RuntimeException捕获的小测试

    public class ExceptionTest { public static void main(String[] args) throws InterruptedException { ne ...

  2. Spark2.x(六十一):在Spark2.4 Structured Streaming中Dataset是如何执行加载数据源的?

    本章主要讨论,在Spark2.4 Structured Streaming读取kafka数据源时,kafka的topic数据是如何被执行的过程进行分析. 以下边例子展开分析: SparkSession ...

  3. Better intuition for information theory

    Better intuition for information theory 2019-12-01 21:21:33 Source: https://www.blackhc.net/blog/201 ...

  4. httpcomponents 发送get post请求

    引入的包为: <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <de ...

  5. Xamarin.FormsShell基础教程(3)Shell项目构成

    Xamarin.FormsShell基础教程(3)Shell项目构成 在创建的ShellDemo解决方案中,有3个子项目,分别为ShellDemo.ShellDemo.Android和ShellDem ...

  6. django入门7之django template和xadmin常用技巧

    django入门7之django template和xadmin常用技巧 <li {% ' == '/course' %}class="active"{% endif %}& ...

  7. MathML

    MathML https://developer.mozilla.org/en-US/docs/Web/MathML/Examples/MathML_Pythagorean_Theorem Mathe ...

  8. netstat -lunpt未找到命令

    [root@localhost ~]# netstat -lunpt -bash: netstat: 未找到命令 [root@localhost ~]# yum -y install net-tool ...

  9. 【APM】Pinpoint 使用教程(二)

    本例介绍Pinpoint使用教程 Pinpoint安装部署参考:[APM]Pinpoint 安装部署(一) 查看应用调用关系拓扑图 进入pintpoint->选择应用-〉选择查看的时间周期,即可 ...

  10. LeetCode_459. Repeated Substring Pattern

    459. Repeated Substring Pattern Easy Given a non-empty string check if it can be constructed by taki ...