1、打印99乘法表
[root@ _212_ ~/bin/for_script]# cat 99_changfa.sh #!/bin/bash line=1 for i in `seq 1 9`; do for k in `seq 1 $i`; do echo -ne "${k}*${i}"="$[$k*$i]\t" done echo done [root@ _213_ ~/bin/for_script]# bash 99_changfa.sh 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
2、利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大者和最小者
[root@ _216_ ~/bin/while]# cat max_min_while.sh #!/bin/bash i=1 max=0 min=1000000000 while [ $i -le 10 ]; do num=$RANDOM echo "$num" if [ $max -lt $num ];then max=$num fi if [ $min -gt $num ];then min=$num fi ((i++)) done echo "max $max" echo "min $min" [root@ _217_ ~/bin/while]# bash max_min_while.sh 14389 18911 31203 16978 21504 21511 16971 2581 30942 25937 max 31203 min 2581
3、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志
/var/log/login.log中,并提示该用户退出系统。
[root@ _245_ ~/bin/8-17_study]# cat login_user.sh #!/bin/bash until false; do if who|grep -q "^hacker ";then echo "`who|grep "^hacker "` 记载时间:`date`">> /var/log/login.log echo "Please logout"|write hacker &>/dev/null fi sleep 3 done
4、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出。
[root@ _249_ ~/bin/8-17_study]# cat num_games.sh #!/bin/bash ram=$[${RANDOM}%10] until false; do read -p "输入10以内正整数:" num [ $num -eq $ram ] && { echo "猜数相等!"; exit; } [ $num -lt $ram ] && { echo "你输入的数太小!";continue; } [ $num -gt $ram ] && { echo "你输入的数太大!!";continue; } done [root@ _250_ ~/bin/8-17_study]# bash num_games.sh 输入10以内正整数:1 你输入的数太小! 输入10以内正整数:3 你输入的数太小! 输入10以内正整数:5 你输入的数太小! 输入10以内正整数:8 你输入的数太大!! 输入10以内正整数:7 你输入的数太大!! 输入10以内正整数:6 猜数相等!
5、扫描/etc/passwd文件每一行,如发现GECOS字段为空,则填充用户名和单位电话为62985600,并提示该用户的GECOS信息修改成功
[root@ _252_ ~/bin/8-17_study]# cat GENCOS.sh #!/bin/bash while read line; do note=`echo "$line" | cut -d: -f5` usr_name=`echo $line | cut -d: -f1` [[ -z $note ]] && chfn -h 62985600 -f 62985600 $usr_name &> /dev/null && echo "$usr_name GECOS 信息修改成功!" done < /etc/passwd
6、
1、写一个服务脚本/root/bin/testsrv.sh,完成如下要求 (1) 脚本可接受参数: start, stop, restart, status (2) 如果参数非此四者之一,提示使用格式后报错退出 (3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功” 考虑:如果事先已经启动过一次,该如何处理? (4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成” 考虑:如果事先已然停止过了,该如何处理? (5) 如是restart,则先stop, 再start 考虑:如果本来没有start,如何处理? (6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示 “ SCRIPT_NAME is running...” 如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“ SCRIPT_NAME is stopped...” 其中: SCRIPT_NAME为当前脚本名
#!/bin/bash script_name=`basename $0` Time=`date +%F-%H-%M:%S` _start(){ if [ -a /var/lock/subsys/$script_name ];then printf "$Time $script_name already Start \n" else touch /var/lock/subsys/$script_name printf "$Time $script_name start Successfully! \n" fi } _stop(){ if ! [ -a /var/lock/subsys/$script_name ];then echo "$Time Warning: $script_name is no Running..." else rm -rf /var/lock/subsys/$script_name printf "$Time $script_name Stop Success!\n" fi } _restart(){ _stop _start } _status(){ if [ -a /var/lock/subsys/$script_name ];then printf "$Time $script_name is Running...\n" else printf "$Time $script_name is Stopped...\n" fi } [ $# -ne 1 ] && { echo -e "Input a arguments!\nUsage: $script_name < option > | start | stop | restart | status ]"; exit; } case "$1" in start) _start ;; stop) _stop ;; restart) _restart ;; status) _status ;; *) echo "Usage: $script_name < option > | start | stop | restart | status ]";exit ;; esac
效果:
7、
编写一个脚本/root/bin/copycmd.sh (1) 提示用户输入一个可执行命令名称; (2) 获取此命令所依赖到的所有库文件列表 (3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下; 如: /bin/bash ==> /mnt/sysroot/bin/bash /usr/bin/passwd ==> /mnt/sysroot/usr/bin/passwd (4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下: 如: /lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ldlinux-x86-64.so.2 (5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命 令,并重复完成上述功能;直到用户输入quit退出
#!/bin/bash until false; do read -t 30 -p "输入一个可执行命令名称:" cmd [[ $cmd == quit ]] && break which $cmd &> /dev/null [ $? -ne 0 ] && { echo "找不到你输入的命令的文件路径!";continue; } cmd_path=`which $cmd |tail -1` mkdir -p /mnt/sysroot`dirname $cmd_path` &> /dev/null echo "创建目录:/mnt/sysroot`dirname $cmd_path`" cp -p $cmd_path /mnt/sysroot`dirname $cmd_path` &> /dev/null echo "复制命令文件:$cmd_path 到 /mnt/sysroot`dirname $cmd_path`" echo "CAPABILITY:" for capability in `ldd /bin/ls |grep "/" |sed -r 's#[^/]*(/[^[:space:]]*)[[:space:]].*#\1#'`; do mkdir -p /mnt/sysroot`dirname $capability` &> /dev/null cp -p $capability /mnt/sysroot`dirname $capability` &> /dev/null echo "复制 $capability 到 /mnt/sysroot`dirname $capability` 下" done done
效果:
8、斐波拉契数列
[root@ _274_ ~/bin/function_di]# cat fibonacci.sh #!/bin/bash read -t 30 -p "输入兔子繁殖代数:" num fibonacci(){ i=$1 a1=1 a2=1 if [ $1 -eq 0 ];then echo "0" elif [ $i -eq 1 -o $i -eq 2 ];then echo "1" else while [ $i -ge 3 ] do an=`echo "$a1+$a2"|bc` a1=$a2 a2=$an ((i--)) done echo "$an" fi } for k in `seq 0 $num`; do echo -n "兔子繁殖$k代后总数为:" fibonacci $k done [root@ _275_ ~/bin/function_di]# bash fibonacci.sh 输入兔子繁殖代数:8 兔子繁殖0代后总数为:0 兔子繁殖1代后总数为:1 兔子繁殖2代后总数为:1 兔子繁殖3代后总数为:2 兔子繁殖4代后总数为:3 兔子繁殖5代后总数为:5 兔子繁殖6代后总数为:8 兔子繁殖7代后总数为:13 兔子繁殖8代后总数为:21 递归: [root@ _297_ ~/bin/function_di]# cat fibo.sh #!/bin/bash fact(){ if [ $1 -eq 0 ];then echo 0 elif [ $1 -eq 1 ];then echo 1 else echo "$[`fact $[$1-1]`+`fact $[$1-2]`]" fi } fact 8 [root@ _298_ ~/bin/function_di]# bash fibo.sh 21
9、汉诺塔
[root@ _299_ ~/bin/function_di]# cat hanoi.sh #!/bin/bash i=1 hanoi(){ if [ $1 -eq 1 ];then printf "$i步: $1 $2 --> $4\n" ((i++)) else hanoi $[$1-1] $2 $4 $3 printf "$i步: $1 $2 --> $4\n" ((i++)) hanoi $[$1-1] $3 $2 $4 fi } read -p "input:" num hanoi $num A B C [root@ _300_ ~/bin/function_di]# bash hanoi.sh input:4 1步: 1 A --> B 2步: 2 A --> C 3步: 1 B --> C 4步: 3 A --> B 5步: 1 C --> A 6步: 2 C --> B 7步: 1 A --> B 8步: 4 A --> C 9步: 1 B --> C 10步: 2 B --> A 11步: 1 C --> A 12步: 3 B --> C 13步: 1 A --> B 14步: 2 A --> C 15步: 1 B --> C
原创文章,作者:M20-1--孔祥文,如若转载,请注明出处:http://www.178linux.com/38056