shell脚本实例大全
❶ shell使用getopts编写一个脚本
下面是一个简单例子(脚本为getopt):
#/bin/bash
echo $0
echo $*
while getopts ":a:bc" opt
do
case $opt in
a )
echo $OPTARG
echo $OPTIND;;
b )
echo "b $OPTIND";;
c )
echo "c $OPTIND";;
? )
echo "error"
exit 1;;
esac
done
echo $OPTIND
echo $*
shift $(($OPTIND - 1))
echo $*
echo $0
运行sh getopt.sh -a 12 -b -c 34 -m
输出:
getopt.sh
-a 12 -b -c 34
12
3
b 4
c 5
5
-a 12 -b -c 34
34
getopt.sh
可以得出一些结论:
1、$0在用sh 或者 ./执行脚本时,指的是脚本名,用source或.执行时,永运是bash,这也反应了sh 或者 ./执行脚本的原理和source的方式是不同的.
2、$1 (1....n)指的第一个参数到....第n个参数
3、OPTARG存储相应选项的参数 OPTIND指向的是下一个参数的index
4、shift 会改变参数的顺序,通过左移去掉某些参数
5、getopts检测到非法参数就会停止,比如上例中遇到34就会终止,并不会去检测-m了,也就是说只要前一个参数是合法的(包含在option_string中的),就会继续检测下一个参数。
❷ shell脚本,实现脚本ip地址变换,每次输出不同的ip地址。
先看效果:
[root@mailtmp]#./runplayload.shiplist.txt-s192.168.33.34-40
Nosuchip【192.168.33.35】in【iplist.txt】
1--192.168.33.34
2--192.168.33.36
3--192.168.33.37
4--192.168.33.38
5--192.168.33.39
6--192.168.33.40
[root@mailtmp]#./runplayload.shiplist.txt-s192.168.33.34-192.168.33.40
Nosuchip【192.168.33.35】in【iplist.txt】
1--192.168.33.34
2--192.168.33.36
3--192.168.33.37
4--192.168.33.38
5--192.168.33.39
6--192.168.33.40
[root@mailtmp]#
看一下iplist.txt文本格式
[root@mailtmp]#catiplist.txt
192.168.33.34
192.168.33.36-192.168.33.40
192.168.33.200
192.168.33.204-210
192.168.33.231
脚本正文:
#!/bin/bash
#------------------------------------------
#Copyritht(C),[email protected]
#脚本名:
#脚本位置:
#脚本用途:
#脚本修改历史:
#<作者><日期><版本><描述>
#老耿2015/07/131.0创建
#版权:GPL
#-------------------------------------------
./root/.bash_profile
#定义ip个数
r=6
#传参判断
echo$3|grep-q"[0-9]-[0-9]";stat=$?#这里在逻辑上应该先判断存不存在$3
if[$#-ne3-o"$2"!="-s"-o${stat}-ne0];then
if[$stat-ne0];then
echo"脚本使用说明:
COMMAND文件名-sip范围
例:sh./run_playload.shiplist.txt-s192.168.33.20-50
或sh./run_playload.shiplist.txt-s192.168.33.20-192.168.33.50"
exit
fi
fi
if[!-f$1];then
echo"文件【$1】不存在!"
exit
fi
#iplist.txt文件格式转换
iplist=`cat$1|awk-F'[-.]''{if($0~/-/){sub(/-.*$/,"",$4);for(i=$4;i<=$NF;i++){print$1"."$2"."$3"."i}}elseprint$0}'`
#xx.xx.xxipv4前三个字节
ip1="`echo$3|sed-r's/.[0-9]+-.*$//'`"
#起始ip最后一个字节
ip2="`echo$3|awk-F'.''{sub(/-.*$/,"",$4);print$4}'`"
#结束ip最后一个字节
ip3="`echo$3|awk-F'[-.]''{print$NF}'`"
#如果起始ip大于结束ip,则两个互换
if(($ip2>$ip3));then
ip_tmp=$ip2
ip2=$ip3
ip3=$ip_tmp
fi
#合并完整的ip,存在ip()里
ip=()
foriin`seq${ip2}${ip3}`
do
ipp="${ip1}.${i}"
echo"${iplist}"|grep-wq"${ipp}"
if[$?-ne0];then
echo"Nosuchip【${ipp}】in【$1】"
else
ip=(${ip[*]}${ipp})
fi
done
#判断ip()不为空的情况
if[-n"${ip[*]}"];then
#定义ip个数
#r=6
#判断ip取值个数,分两种情况处理
if((${r}<=${#ip[@]}));then
foriin`seq${r}`
do
letj=$i-1
echo"${i}--${ip[j]}"
done
else
for((i=0;i<${#ip[@]};i++))
do
letj=$i+1
echo"${j}--${ip[i]}"
done
echo"WARNING:受范围限制,未能取到完整的${r}个ip!"
fi
fi
❸ 用shell写一个脚本一个文档里面的100万条URL下载.
#!/bin/bash
whilereadline
do
wget$line&>/dev/null
done<urlfile.txt
❹ 写一个简单的shell脚本或Python脚本
url="/File"
for ((i=1;i<21;i++))
do
mkdir -p ${url}/File$i
touch ${url}/File$i/text{1..3}
touch ${url}/File$i/{1..20}text
done
这个url意思是您要创建的文件夹的位置 ,自己可以更改为想要的目录,这是shell脚本,我是在centos里用的,,别的不知道
❺ 编写以下shell脚本,保存为/exam/shell目录下的(1.sh 2.sh 3.sh):
1.取出/etc/passwd文件中的用纳圆户名和UID的字段,并将输出结果以UID的大小顺序排列;
[root@localhost shell]# cat 1.sh
#!/bin/bash
awk -F: '{print $3,$1}' /etc/passwd|sort -n
2.判断漏信输入的数值是奇数还是偶数;
[root@localhost shell]# cat 2.sh
#!/bin/bash
read num
if [ `expr $num % 2` = '0' ];then
echo "the number is 偶数"
else
echo "the number is 奇数"
fi
3.批量创建30个用户,用户洞搜塌名为exam1~exam30,用户密码统一为gdlclinux。
[root@localhost shell]# cat 3.sh
#!/bin/bash
for((i=1;i<=30;i++))
do
useradd exam$i
echo gdlclinux|passwd --stdin exam$i
done