[关闭]
@mrz1 2017-12-23T12:30:49.000000Z 字数 11221 阅读 945

2017-12-18课程笔记(计划任务 if for case)

笔记


磁盘访问量: iotop iostat
网卡利用率(吞吐量):dstat(动态观察) ifconfig -s eth0(动态 watch -n0.5 ifconfig -s eth0

并行运行

同时运行多个进程,提高效率

  1. 方法1
  2. vi all.sh
  3. f1.sh&
  4. f2.sh&
  5. f3.sh&
  6. 方法2
  7. (f1.sh&);(f2.sh&);(f3.sh&) //开三个子shell 后台执行
  8. 方法3
  9. { f1.sh& f2.sh& f3.sh& }

任务计划

Linux任务计划、周期性任务执行
未来的某时间点执行一次任务
at
batch:系统自行选择空闲时间去执行此处指定的任务
周期性运行某任务
cron

centos6 /etc/rc.d/init.d/atd //at服务进程为例

  1. [root@centos6 ~]#chkconfig --list atd //查看是否开机启动
  2. atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
  3. [root@centos6 ~]#runlevel //现在运行的模式是5模式是启动呢
  4. N 5
  5. [root@centos6 ~]#chkconfig atd on //设置开机启动
  6. [root@centos6 ~]#service atd status //现在是否启动
  7. atd (pid 2123) is running...

centos7 /usr/lib/systemd/system/atd.service //at服务进程为例

  1. [root@centos7 ~]#systemctl is-enabled atd //开启服务.service 可以省略
  2. enabled //表示开机启动
  3. systemctl status atd //现在是否启动(与contos6 不一样)好处可以执行多个命令
  1. [root@centos7 ~]#systemctl status atd
  2. atd.service - Job spooling tools
  3. Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
  4. Active: active (running) since Mon 2017-12-18 19:31:01 CST; 1h 18min ago
  5. Main PID: 947 (atd)
  6. CGroup: /system.slice/atd.service //这个服务调用的是/usr/sbin/atd
  7. └─947 /usr/sbin/atd -f
  8. .........

同步服务器时间 ntpdate 127.0.0.1(ip地址) 同步硬件时间 clock -w

所有实验的基础

  1. 时间同步准确
  2. iptables off (防火墙关闭)
  3. selinux off (强制访问控制系统关闭)

at任务

  1. 包:at
  2. at命令:at [option] TIME
  3. 常用选项:
  4. -V 显示版本信息:
  5. -l: 列出指定队列中等待运行的作业;相当于atq
  6. -d: 删除指定的作业;相当于atrm
  7. -c: 查看具体作业任务
  8. -f /path/from/somefile:从指定的文件中读取任务
  9. -m:当任务被完成之后,将给用户发送邮件,即使没有标准输出
  10. 注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户
  11. 建议:如果放到计划任务中的脚本,涉及到没有必要的标准输出;建议扔到垃圾箱`/dev/null`否则产生大量垃圾邮件
  12. TIME:定义出什么时候进行at 这项任务的时间
  13. HH:MM [YYYY-mm-dd]
  14. noon 中午,midnight 午夜, teatime4pm)下午茶时间(下午4时)
  15. tomorrow 明天
  16. now+#{minutes(分),hours(时),days(日), OR weeks(星期)}

at时间格式

  1. HH:MM 02:00
  2. 在今日的HH:MM 进行,若该时刻已过,则明天此时执行任务
  3. HH:MM YYYY-MM-DD 02:00 2016-09-20
  4. 规定在某年某月的某一天的特殊时刻进行该项任务
  5. HH:MM[am|pm] [Month] [Date]
  6. 04pm March 17
  7. 17:20 tomorrow
  8. HH:MM[am|pm] + number [minutes|hours|days|weeks]
  9. 在某个时间点再加几个时间后才进行该项任务
  10. now + 5 minutes
  11. 02pm + 3 days

at任务

  1. 执行方式:(1)交互式 (2)输入重定向 (3)at –f 文件
  2. 依赖与atd服务,需要启动才能实现at任务
  3. at队列存放在/var/spool/at目录中
/etc/at.{allow,deny}控制用户是否能执行at任务
白名单:/etc/at.allow默认不存在,只有该文件中的用户才能执行at命令
黑名单:/etc/at.deny默认存在,拒绝该文件中用户执行at命令,而没有在at.deny文件中的使用者则可执行
如果两个文件都不存在,只有root 可以执行at 命令

注意:如果建立白名单则只有白名单人员生效,黑名单失效 ;白名单没人;则只有root可以执行

周期性任务计划cron

周期性任务计划:cron
相关的程序包:
1. cronie: 主程序包,提供crond守护进程及相关辅助工具
2. cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
3. crontabs:包含CentOS提供系统维护任务;例:run-parts /app/执行app下所有脚本

计划任务

确保crond守护处于运行状态:
CentOS 7:systemctl status crond
CentOS 6:service crond status
计划周期性执行的任务提交给crond,到指定时间会自动运行系统cron任务:
系统维护作业:/etc/crontab
用户cron任务:crontab命令
日志:/var/log/cron //看看计划任务执行了没有 假如误删除脚步 可以在/var/log/cron里面根据时间和执行过的命令来恢复脚本

系统cron任务:/etc/crontab
注释行以:# 开头
详情参见:man 5 crontab

  1. [root@centos7 ~]#cat /etc/crontab
  2. SHELL=/bin/bash
  3. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  4. MAILTO=root
  5. # For details see man 4 crontabs
  6. # Example of job definition:
  7. # .---------------- minute (0 - 59) 分钟
  8. # | .------------- hour (0 - 23) 小时
  9. # | | .---------- day of month (1 - 31) 日
  10. # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... 月
  11. # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR 星期 sun,mon,tue,wed,thu,fri,sat
  12. # | | | | |
  13. # * * * * * user-name command to be executed
  14. 星期 用户名 运行什么命令
  15. 例如:晚上910分运行echo命令
  16. 10 21 * * * centos /bin/echo "Howdy!"
  17. 注意:命令执行的日期可以在下面两个中指定
  18. 字段——“月日”和“周”。如果两个域都受到限制(例如,
  19. 不包含“*”字符),命令将在两个字段中运行
  20. 匹配当前时间。例如,
  21. 30 4 1,15 * 5 将导致命令在1号和15号凌晨4:30运行
  22. 每个月,加上每周五。
  1. [root@centos7 ~]#weekday=`date +%w`;[ "$weekday" = "0" -o "$weekday" = "6" ] && echo "0,6" //查看是否为周六日

时间表示法:
(1) 特定值:给定时间点有效取值范围内的值
(2) *:给定时间点上有效取值范围内的所有值 表示“每...”
(3) 离散取值:#,#,#
(4) 连续取值:#-#
(5) 在指定时间范围上,定义步长:/#: #即为步长

  1. seq 1 10| sed -n "1~2p" //取奇数
  2. seq 1 10| sed -n "2~2p" //取偶数

时间格式

  1. @rebootRun once after reboot. //重启之后执行一次
  2. @yearly 0 0 1 1 * //一月一号零点零分执行
  3. @annually 0 0 1 1 * //一月一号零点零分执行
  4. @monthly 0 0 1 * * //每月一号零点零分执行
  5. @weekly 0 0 * * 0 //每月周日零点零分执行
  6. @daily 0 0 * * * //每天零点零分执行
  7. @hourly 0 * * * * //每小时执行
  8. * * * * * //每分钟执行
  9. 示例1:每3小时echowall命令
  10. 0 */3 * * * centos /bin/echo "howdy";/usr/bin/wall "welcome to Magedu!"
  11. 示例2:每天一点把前天/etc/sysconfig/打包并压缩
  12. 0 1 * * * root tar -zcvf /app/syscongfig`date +\%F -d "-1 day"`.tar.gz /etc/sysconfig/

计划任务

系统的计划任务:/etc/crontab
配置文件:/etc/cron.d/ //放到这个目录下方便管理
小时脚本:/etc/cron.hourly//usr/bin/on_ac_power >/dev/null//查看是否是电池供$?=1 就是电池供电
每日脚本:/etc/cron.daily/
每周脚本:/etc/cron.weekly/
明天脚本:/etc/cron.monthly/

anacron系统

  1. 运行计算机关机时cron不运行的任务,CentOS6以后版本取消anacron服务,由crond服务管理
  2. 对笔记本电脑、台式机、工作站、偶尔要关机的服务器及其它不一直开机的系统很重要对很有用
  3. 配置文件:/etc/anacrontab,负责执行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly中系统任务。
    字段1:如果在这些日子里没有运行这些任务......
    字段2:在重新引导后等待这么多分钟后运行它
    字段3:任务识别器,在日志文件中标识
    字段4:要执行的任务
  4. 由/etc/cron.hourly/0anacron执行
  5. 当执行任务时,更新/var/spool/anacron/cron.daily 文件的时间戳

管理临时文件

  1. CentOS6使用/etc/cron.daily/tmpwatch定时清除临时文件
  2. CentOS7使用systemd-tmpfiles-setup服务实现;例:systemctl status systemd-tmpfiles-setup //查看现在是否启动
  3. 配置文件:
    /etc/tmpfiles.d/*.conf
    /run/tmpfiles.d/*.conf
    /usr/lib/tmpfiles/*.conf
    备注源文件中\ 是转译* 不转译会是斜线
  4. /usr/lib/tmpfiles.d/tmp.conf
    d /tmp 1777 root root 10d
    d /var/tmp 1777 root root 30d
  5. 命令:
    systemd-tmpfiles –clean|remove|create configfile

计划任务

  1. 用户cron:
    crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
  1. crontab命令:
  2. crontab[-u user] [-l | -r | -e] [-i]
  3. -l: 列出所有任务;
  4. -e: 编辑任务;
  5. -r: 移除所有任务;
  6. -i:同-r一同使用,以交互式模式移除指定任务
  7. -u user: root可运行,指定用户管理cron任务
  8. 控制用户执行计划任务:
  9. /etc/cron.{allow,deny}

注意:/var/spool/cron/里面文件谁改所属组所有者就是谁 ;有特殊权限

  1. [root@centos7 ~]#which cron
  2. tab
  3. /usr/bin/crontab
  4. [root@centos7 ~]#ll /usr/bin/crontab
  5. -rwsr-xr-x. 1 root root 57576 Aug 3 23:33 /usr/bin/crontab

at和crontab

一次性作业使用at
重复性作业使用crontab

  1. Create at time crontab -e
  2. List at -l crontab -l
  3. Details at -c jobnum N/A
  4. Remove at -d jobnum crontab -r
  5. Edit N/A crontab -e

没有被重定向的输出会被邮寄给用户
根用户能够修改其它用户的作业

计划任务

注意:运行结果的标准输出和错误以邮件通知给相关用户
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义,将%放置于单引号中,则可不用转义

思考:

  1. (1) 如何在秒级别运行任务?
  2. * * * * * for min in 0 1 2; do echo "hi"; sleep 10;
  3. done
  4. * * * * * /bin/f1.sh sleep 10 //每秒执行
  5. (2) 如何实现每7分钟运行一次任务?
  6. sleep命令:
  7. sleep NUMBER[SUFFIX]...
  8. SUFFIX:
  9. s: 秒, 默认
  10. m:
  11. h: 小时
  12. d:

练习

1、每天的2点和12点整,将/etc备份至/testdir/backup目录中,保存的文件名称格式为“etcbak-yyyy-mm-dd-HH.tar.xz”

  1. 0 2,12 * * * root tar -zcvf /testdir/backup/etcbak-`date +\%w -d "-1 day"`.tar.xz /etc/

2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd”

  1. * * * * 2,4,7,0 root cp /var/log/messages /logs/messages`date +\%`

3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中

4、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报

Shell编程进阶

流程控制

过程式编程语言:顺序执行 选择执行 循环执行

条件选择if语句

选择执行:
注意:if语句可嵌套
单分支:

  1. if 判断条件;then
  2. 条件为真的分支代码
  3. fi

双分支:

  1. if 判断条件; then
  2. 条件为真的分支代码
  3. else
  4. 条件为假的分支代码
  5. fi

多分支

  1. if 判断条件1; then
  2. 条件为真的分支代码
  3. elif 判断条件2; then
  4. 条件为真的分支代码
  5. elif 判断条件3; then
  6. 条件为真的分支代码
  7. else
  8. 以上条件都为假的分支代码
  9. fi

逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句

If示例

根据命令的退出状态来执行命令

  1. if ping -c1 -W2 station1 &> /dev/null;then //-c 一次 -W2超时2秒
  2. echo'Station1isUP'
  3. elif grep "station1" ~/maintenance.txt &> /dev/null then //维护列表 maintenance.txt
  4. echo'Station1 is undergoing maintenance'
  5. else
  6. echo'Station1 is unexpectedly DOWN!'
  7. exit1
  8. fi
  1. test 整数1 -eq 整数2 #整数相等
  2. test 整数1 -ge 整数2 #整数1大于等于整数2
  3. test 整数1 -gt 整数2 #整数1大于整数2
  4. test 整数1 -le 整数2 #整数1小于等于整数2
  5. test 整数1 -lt 整数2 #整数1小于整数2
  6. test 整数1 -ne 整数2 #整数1不等于整数2

判断年龄

  1. read -p "please input your age: " age
  2. if [[ ! "$age" =~ ^[0-9]+$ ]];then
  3. echo "请输入数字"
  4. exit 2
  5. elif [ "$age" -gt 18 ];then
  6. echo "you are too old"
  7. else
  8. echo "you are very young"
  9. fi

判断成绩

  1. read -p "Please enter the score (score): " chengji
  2. if [[ ! "$chengji" =~ ^[0-9]+$ ]];then
  3. echo "please enter a number"
  4. exit 2
  5. elif [ "$chengji" -le 59 ];then
  6. echo " good"
  7. elif [ "$chengji" -le 80 ];then
  8. echo "very good"
  9. elif [ "$chengji" -le 100 ];then
  10. echo "very very good"
  11. else
  12. echo "Input error "
  13. fi

条件判断:case语句

  1. case 变量引用 in
  2. PAT1)
  3. 分支1
  4. ;;
  5. PAT2)
  6. 分支2
  7. ;;
  8. ...
  9. *)
  10. 默认分支
  11. ;;
  12. esac
case支持glob风格的通配符:
*: 任意长度任意字符
?: 任意单个字符
[]:指定范围内的任意单个字符
a|b: a或b

case实例

  1. read -p "please input a number(0-9): " num
  2. case "$num" in
  3. 1|2|3)
  4. echo 1,2,3
  5. ;;
  6. 4|5|6)
  7. echo 4,5,6
  8. ;;
  9. 7|8|9)
  10. echo 7,8,9
  11. ;;
  12. *)
  13. echo other
  14. ;;
  15. esac

练习

1、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息

2、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息

  1. read -p "Do you agree? (yes or no): " ans
  2. case "$ans" in
  3. [Yy]|[Yy][Ee][Ss])
  4. echo yes
  5. ;;
  6. [Nn]|[Nn][Oo])
  7. echo no
  8. ;;
  9. *)
  10. echo other
  11. ;;
  12. esac

3、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)

4、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数

循环

  1. 循环执行
  2. 将某代码段重复运行多次
  3. 重复运行多少次:
  4. 循环次数事先已知
  5. 循环次数事先未知
  6. 有进入条件和退出条件
  7. for, while, until

for循环

  1. for 变量名 in 列表;do
  2. 循环体
  3. done

执行机制:依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束

列表生成方式

  1. (1) 直接给出列表
  2. (2) 整数列表:
  3. (a) {start..end}
  4. (b) $(seq[start [step]] end)
  5. (3) 返回列表的命令
  6. $(COMMAND)
  7. (4) 使用glob,如:*.sh
  8. (5) 变量引用;$@, $*

[root@centos7 ~]# nmap -v -A 47.93.96.95 扫描器;扫描这个ip
yum install play //播放音乐

练习:用for实现

1、判断/var/目录下所有文件的类型

  1. dir="/var"
  2. for i in $(ls -1 $dir) ; do
  3. type=`ls -ld $file |cut -c 1`
  4. echo -n "$dir/$i===============>"
  5. case $type in
  6. -)
  7. echo "general file"
  8. ;;
  9. d)
  10. echo "dir"
  11. ;;
  12. l)
  13. echo "link"
  14. ;;
  15. s)
  16. echo "socket"
  17. ;;
  18. b)
  19. echo "block"
  20. ;;
  21. c)
  22. echo "character"
  23. ;;
  24. *)
  25. echo "other"
  26. ;;
  27. esac
  28. done

2、添加10个用户user1-user10,密码为8位随机字符

  1. for i in {1..10};do
  2. username=name$i
  3. useradd $username
  4. password=`openssl rand -hex 4`
  5. echo $password | passwd --stdin $username &> /app/null.txt
  6. echo $username $password >> password.txt
  7. done
  8. echo "finish"

3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start

  1. for i in `ls -1 /etc/rc.d/rc3.d` ; do
  2. type=`echo $i | cut -c 1 `
  3. #echo type
  4. if [ "$type" == "S" ] ; then
  5. echo "$i start"
  6. elif [ "$type" == "K" ] ; then
  7. echo "$i stop"
  8. else
  9. echo "$i unkown"
  10. fi
  11. done

4、编写脚本,提示输入正整数n的值,计算1+2+...+n的总和

  1. sum=0;for i in {1..n};do let sum=sum+$i;done ;echo $sum

5、计算100以内所有能被3整除的整数之和

  1. sum=0;
  2. for i in `seq 1 100`;do <----> for i in {1..100};do //都可以
  3. yu=$[i%3]
  4. if [ "$yu" -ne 0 ];then
  5. let sum+=i
  6. fi
  7. done
  8. echo $sum

6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态

  1. >ip.log
  2. read -p "please input your network(eg:192.168.1.0): " network
  3. [[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] || { echo -e "\033[31mplease input a leaal IP\033[0m"; exit 1; }
  4. net=`echo $network | cut -d. -f1-3`
  5. for i in {1..254};do
  6. {
  7. if ping -c1 -W1 $net.$i &> /dev/null;then
  8. echo $net.$i is up |tee -a ip.log
  9. else
  10. echo $net.$i is down
  11. fi
  12. }&
  13. done
  14. wait

7、打印九九乘法表

  1. #!/bin/bash
  2. for i in `seq 9`;do
  3. for j in `seq $i`;do
  4. echo -e "${j}x${i}=$[i*j]\t\c"
  5. done
  6. echo
  7. done
  8. bash -x 调试跟踪

8、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html

  1. cat /dev/urandom | head -n 10 | base64 |tr -d [[:punct:]][[:digit:]]|head -c8 //随机八个字母
  2. openssl rand -base64 100 | tr -dc [[:alpha:]] |head -c8 //随机八个字母
  3. openssl rand -base64 100 | sed -r 's/[^[:alpha:]]//g'|head -c8 //随机八个字母
  4. openssl rand -base64 100 | grep -o [[:alpha:]]|tr -d '\n'|head -c8 //随机八个字母
  5. ------------------------------------------------------
  6. dir=/testdir
  7. if [ ! -d $dir ] ; then
  8. mkdir -pv $dir &>/dev/null
  9. fi
  10. for i in `seq 1 10` ; do
  11. tmp=`openssl rand -base64 100 |tr -dc "[:alpha:]"|head -c 8`
  12. touch $dir/$i$tmp.html
  13. done

9、打印等腰三角形
实例1:

  1. line=5
  2. for i in `seq 1 $line` ; do
  3. len=$[2*line+1]
  4. for j in `seq 1 $len` ; do
  5. if [ $j -le $[line-i] -o $j -ge $[line+i] ] ; then
  6. echo -n " "
  7. else
  8. echo -n "*"
  9. fi
  10. done
  11. echo
  12. done
  13. *
  14. ***
  15. *****
  16. *******
  17. *********

实例2:好理解

  1. #!/bin/bash
  2. read -p "请输入行数:" line
  3. for i in `seq $line`;do
  4. space=`echo $[line-i]`
  5. for j in `seq $space`;do
  6. echo -n " "
  7. done
  8. for k in `seq $[i*2-1]`;do
  9. echo -n "*"
  10. done
  11. echo
  12. done

实例3:空心三角形

  1. #!/bin/bash
  2. read -p "Please input the triangle side" n
  3. for i in `seq $n`;do
  4. for j in `seq $[n-i]`;do
  5. echo -e " \c"
  6. done
  7. if [[ "$i" -ne 1 ]]; then
  8. echo -e "*\c"
  9. fi
  10. if [[ "$i" -ne 1 && "$i" -ne "$n" ]]; then
  11. {
  12. for k in `seq $[2*(i-1) -1]`
  13. do
  14. echo -e " \c"
  15. done
  16. }
  17. fi
  18. if [[ "$i" -eq "$n" ]]; then
  19. {
  20. k=0
  21. for k in `seq $[2*i-3]`
  22. do
  23. echo -e "*\c"
  24. done
  25. }
  26. fi
  27. echo -e "*"
  28. done
  29. *
  30. * *
  31. * *
  32. * *
  33. * *
  34. ***********

10、打印国际象棋
实例:1

  1. line=8
  2. line2=$[line*2]
  3. for i in `seq 1 8 ` ; do
  4. for j in `seq 1 $line2 ` ; do
  5. if [ $[i%2] -eq 1 ] ; then
  6. if [ $[j%4] -eq 1 -o $[j%4] -eq 2 ] ; then
  7. echo -ne "\033[41m \033[0m"
  8. else
  9. echo -ne "\033[42m \033[0m"
  10. fi
  11. else
  12. if [ $[j%4] -eq 1 -o $[j%4] -eq 2 ] ; then
  13. echo -ne "\033[42m \033[0m"
  14. else
  15. echo -ne "\033[41m \033[0m"
  16. fi
  17. fi
  18. done
  19. echo
  20. done

实例2:

  1. #!/bin/bash
  2. read -p "输入每个方格的大小(2space=1):" weight
  3. for i in `seq 8`;do
  4. for j in `seq $weight`;do
  5. if [ "$[i%2]" = 1 ];then
  6. colour1=41
  7. colour2=42
  8. else
  9. colour1=42
  10. colour2=41
  11. fi
  12. for k in `seq 4`;do
  13. for n in `seq $weight`;do
  14. echo -ne "\033[${colour1}m \033[0m"
  15. done
  16. for m in `seq $weight`;do
  17. echo -ne "\033[${colour2}m \033[0m"
  18. done
  19. done
  20. echo
  21. done
  22. done

实例3:完美

  1. color1=`seq 40 47 |sed -n "1~2p"|sort -R|head -1`
  2. color2=`seq 40 47 |sed -n "2~2p"|sort -R|head -1`
  3. redyel () {
  4. if [ "$1" = "-r" ];then
  5. echo -en "\033[${color1}m \033[0m\c"
  6. echo -en "\033[${color2}m \033[0m\c"
  7. else
  8. echo -en "\033[${color2}m \033[0m\c"
  9. echo -en "\033[${color1}m \033[0m\c"
  10. fi
  11. }
  12. for i in `seq 4`;do
  13. for j in `seq 4`;do
  14. for a in `seq 4`;do
  15. redyel -r
  16. done
  17. echo
  18. done
  19. for k in `seq 4`;do
  20. for b in `seq 4`;do
  21. redyel
  22. done
  23. echo
  24. done
  25. done
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注