此文将整理一些简单实用、有趣易学的 shell 练习脚本,希望可以帮到一些想学习 shell 的初学者。张戈也会在闲暇时间不定期更新此文,对已有实例进行改进和注释,增强可读性和易懂性。当然我也会不定期的添加更多简单、有趣且实用的 shell 练习脚本,帮助一些有需要的入门学习者。
一、编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息。
原文代码为:
#!/bin/bash if ! grep "^#!" $1 &>/dev/null; then cat >> $1 << EOF #!/bin/bash # Author: #Date & Time: `date +"%F %T"` #Description: EOF fi vim +5 $1
初学者看到这代码,可能不太会用,其实很简单,看到有$1,就表示需要带参数来执行,所以,这个脚本的执行方法是:
①、将以上代码保存为 shell 脚本,比如 test,
②、使用 chmod 加上执行权限,chmod +x test
③、执行 ./test newfile 即可看到效果。
Ps:当然也可以不要第②步,直接使用 sh test newfile 即可。
执行效果如下:
这个脚本对于经常写 shell 的童鞋就很有用,但是忘记带参数执行就会卡住不动,而且不带路径的话就直接在当前目录下生成新文件,会很乱。所以张戈就将其改进一下,变得更加易用:
#!/bin/bash if [[ -z "$1" ]];then newfile=~/newscript_`date +%m%d_%S` else newfile=$1 fi if ! grep "^#!" $newfile &>/dev/null; then cat >> $newfile << EOF #!/bin/bash # Author: Inert Your Name here. #Date & Time: `date +"%F %T"` #Description: Please Edit here. EOF fi vim +5 $newfile
改进说明:如果未带参数执行,将在家目录下生成带时间戳的新文件,避免重复及乱的问题。可将这个脚本改名后直接丢到 path 路径中,比如/bin/addjb 那么你的系统就多了一个命令 addjb 了,是不是很有趣呢!
时间有限,以下脚本暂时就不做测试、解释或改进了,请先自行测试吧!有空再来更新。
二、任意三个整数,判断最大数。
#!/bin/bash echo "please enter three number:" read -p "the first number is :" n1 read -p "the second number is:" n2 read -p "the third number is:" n3 let MAX=$n1 if [ $n2 -ge $n1 ]; then MAX=$n2 fi if [ $n3 -ge $MAX ]; then MAX=$n3 fi echo "the max number is $MAX."
执行效果:
注:非常简单的逻辑判断脚本,有兴趣的可以改进下,练练手。
三、求 100 以内偶数的和。
方法①:
#!/bin/bash sum=0 for I in {1..50}; do sum=$(($sum+2*$I)) done echo "the sum is $sum"
方法②:
#!/bin/bash let SUM=0 for I in $(seq 1 100); do if [ $[$I%2] == 0 ]; then let SUM+=$I fi done echo "the sum is $SUM."
四、利用 for 语句 ping C 类网、ping B 类网。
①、ping C 类网:
#!/bin/bash read -p "C NETWORK:" MYNET PINGNET=`echo $MYNET | sed 's/\([0-9.]*\)\ .[0-9]*/\1/g'` let I=1 while [ $I -le 254 ];do ping –c1 –W1 $PINGNET.$I &>/dev/null [ $? -eq 0 ] && echo "$PINGNET.$I online." || echo "$PINGNET.$I offline." let I++ done
②、ping B 类网:
#!/bin/bash read -p "B network:" MYNET PINGNET=`echo $MYNET | sed 's/\([0-9]\{1,3\}\.[0-9]\{1,3\}\)\..*/\1/g'` for P in {0..255}; do for I in {1..255}; do if ping -c1 -W2 $PINGNET.$P.$I &>/dev/null; then echo "$PINGNET.$P.$I is online." else echo "$PINGNET.$P.$I is offline." fi done done
五、提示输入一个用户名,判断用户是否存在,如果存在,显示一下用户默认的 shell。
#!bin/bash read –p "please input a username:" USER if cut –d:-f1 /etc/passwd | grep "^$USER$" &> /dev/null ;then MYBASH=`grep "^$USER:" /etc/passwd | cut –d : -f7` echo "${USER}'s shell is $MYBASH" else echo "$USER not exists." exit 4 fi
六、监控系统登录人数,超过四个,显示已经达到四个,5S 检查一下,并退出脚本(exit)
#! /bin/bash read –p "A user:" MYUSER cut –d : -f1 /etc/passwd | grep "^$MYUSER" &> /dev/null || exit 6 let COUNT=`who | grep "^$MYUSER" | wc –l` until [ $COUNT –ge 4 ]; do sleep 5 let COUNT=`who | grep “^$MYUSER” | wc -l` done echo "$MYUSER loged 4 times."
我看着脚本就头疼
我是看着眼睛疼。
不懂,还没搞过shell
懂php就行了,本质都是脚本语言。
有点复杂,有入门的吗?例如:定时功能。类似windows下的at 时间命令?
定时的比window简单多了,一个crontab -e 就可以搞定了。
嗯 赞 学习了~lnmp一键安装包也有写一些脚本看过一些写的都好赞
我刚到新公司还得慢慢看脚本,有几百个。。。
对了 博主教我来个自动删除N天前的各种目录.log日志的脚本吧
很多方法的。
有业务逻辑方面的大段脚本,不推荐使用shell来处理,因为其并不擅长这方面,语法晦涩复杂,考虑python更合适。shell更适合一二行搞定的任务,我最近在写shell快速指南,欢迎提建议;http://blog.me115.com/
不错,期待你的大作。
tag内链的title标签是自己改的吧?跟我一样追求完美啊,哈哈!
从WP大学拿到的代码,自己修改了下。强迫症有些严重。。。
需要反引号才对吧
判断3个数大小,我稍微改了了下,可以判断用户输入的信息是否为空或者是否为数值
#!/bin/bash
echo "please enter three number:"
read -p "the first number is :" n1
read -p "the second number is:" n2
read -p "the third number is:" n3
if [ -n "$n1" -a -n "$n2" -a -n "$n3" ]
then
test1=$(echo $n1 | sed 's/[0-9]//g')
test2=$(echo $n2 | sed 's/[0-9]//g')
test3=$(echo $n2 | sed 's/[0-9]//g')
let MAX=$n1
if [ $n2 -ge $n1 ]; then
MAX=$n2
fi
if [ $n3 -ge $MAX ]; then
MAX=$n3
fi
echo "the max number is $MAX."
else
echo "请输入正确的信息"
exit 11
fi
还对比了下-n 和 ! -z 好像是一样的作用
man看看
第一个脚本写的有问题吧if [ ! -n "$1" ]这个应该是[ -n "$1" ]或者[ ! -z "$1" ]
确实错了,我更正下。
这个在windows下是不是可以用cygwin来模拟运行的
没看懂&>这一行,能否解释一下,我是菜鸟
PINGNET=`echo $MYNET | sed 's/\([0-9.]*\)\ .[0-9]*/\1/g'` 这个没看懂,能解释下吗
这是一个sed+正则匹配,取IP段的前2段,比如 MYNET是 192.168.0.1/24
执行后得到 192.168
北大大大