用shell编写for/while循环

本文最后更新于2014年7月5日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢!

因为在编写shell的时候for循环是个比较重要的语法结构,经常会碰到所以想及时做个总结/备忘,方便以后查阅:

x.循环读取文件每一个非空行的内容
GITDIR="$HOME/git_s"
mkdir -p $GITDIR

cd $GITDIR
while read p; do
    if [ -n "$p" ]; then
        echo $p
        git clone $p
    fi
done < $HOME/github_links.txt
0.最简单/常用的通配符方式
for i in *.txt;do
	mkdir ${i%.txt};	#取txt文件名来创建目录
	( cd ${i%.txt} && wget -i ../$i --no-check-certificate );
done
1.简单的数字+1的形式
for((i=1; i<30; i++));do
	dt=$(date +%Y%m%d -d " $i days ago")
	echo $dt
done
2.数组形式
COUNTRY=('cn' 'hk' 'tw')
for c in ${COUNTRY[@]}
do
	wget "http://www.ipdeny.com/ipblocks/data/countries/$c.zone"
	country_file=$c.zone
	IPS=$($EGREP -v "^#|^$" $country_file)
	for ip in $IPS
	do
		echo "blocking $ip"
		iptables -A INPUT -s $ip -j DROP
	done
done
3.嵌套循环
dirs=(papers tips tools news web pentesting database binary '%e8%bf%90%e7%bb%b4%e5%ae%89%e5%85%a8')
for dir in ${dirs[@]}
do
	for i in $(seq 1 5)
	do
	if [ "$i" == 1 ]
	then
		echo http://drops.wooyun.org/category/$dir
	else
		echo http://drops.wooyun.org/category/$dir/page/$i
	fi
	done
done

echo '###################################################'

dirs=(papers tips tools news web pentesting database binary '%e8%bf%90%e7%bb%b4%e5%ae%89%e5%85%a8')
dir_num=${#dirs[@]}
for((i=0;i<$dir_num;i++))
do
	for j in $(seq 1 5)
	do
		if [ "$j" == 1 ]
		then
			echo http://drops.wooyun.org/category/${dirs[i]}
		else
			echo http://drops.wooyun.org/category/${dirs[i]}/page/$j
		fi
	done
done

暂时就差不这些,以后有别的tips再及时补充。

求一个shell循环_以获取03年至今的每一天日期
如题:
date=`date +%Y%m%d -d ” 1 days ago”`
把里面的1变为一个变量,由1-800循环,这样就实现了一个期间日期的循环显示,大概就是这样一个意思。
k=1
while((k++<=800));do
    echo `date +%Y%m%d -d " $k days ago"`
done
-----
for((i=1;i<800;i++));do
    echo $i
    dt=$(date +%Y%m%d -d ' -'$i' day')
    echo $dt
done
经过测试之后OK!

#!/bin/bash

for((i=0; i<10; i++));do
	echo $(expr $i * 4)
done

for i in $(seq 10);do
	echo $i
done

i=1
while(($i<10));do
	echo $i
	i=`expr $i + 1`
done

for i in {1..10};do
	echo $i
done

for i in {01..10};do
	echo $i
done

for i in {a..z};do
	echo $i
done

for i in $(ls);do
	echo $i
done

for i in `ls`;do
	echo $i
done

for i in f1 f2 f3;do
	echo $i
done

cat /tmp/drops.txt | while read url title
do
    title=$(echo $title | tr ' </' '_')
    curl -s $url | sed -n '/<div id="content">/,/entry-tags/p' >/tmp/tmp.html
    cat /tmp/top.html /tmp/tmp.html /tmp/bottom.html >/tmp/$title.html
done

while read url title
do
    title=$(echo $title | tr ' </' '_')
    curl -s $url | sed -n '/<div id="content">/,/entry-tags/p' >/tmp/tmp.html
    cat /tmp/top.html /tmp/tmp.html /tmp/bottom.html >/tmp/$title.html
done < /tmp/drops.txt

####
dir=(papers tips tools news web pentesting database binary)
dir_num=${#dir[@]}
for((i=0;i<$dir_num;i++))
do
	for j in $(seq 1 15)
	do
	if [ "$j" == 1 ]
	then
		echo http://drops.wooyun.org/category/${dir[i]}
	else
		echo http://drops.wooyun.org/category/${dir[i]}/page/$j
	fi
	done
done
####

arr=("a" "b" "c")
echo "arr is (${arr[@]})"

arr=(a b c)
for i in ${arr[@]}
do
	echo $i
done


echo "参数,$*表示脚本输入的所有参数:"
for i in $* ; do
	echo $i
done

EGREP=/bin/egrep
COUNTRY=('cn' 'hk' 'tw')
for c in ${COUNTRY[@]}
do
    wget "http://www.ipdeny.com/ipblocks/data/countries/$c.zone"
    country_file=$c.zone
    IPS=$($EGREP -v "^#|^$" $country_file)
    for ip in $IPS
    do
        echo "blocking $ip"
        iptables -A INPUT -s $ip -j DROP
    done
done

# SHELL数组详解
# http://ixyzero.com/blog/archives/178.html
$ A=(a b c def)

$ echo ${A[@]}		#取全部元素
a b c def

$ echo ${A[0]}		#取第一个元素
a

$ echo ${#A[@]}		#取得数组元素的个数
4

$ echo ${#A[3]}		#取得第4个元素的长度
3
Bash中for/while的无限循环

搜索关键字:linux bash while infinite loop

参考解答:
#!/bin/bash
while :; do
	echo "Press [CTRL+C] to stop.."
	sleep 1
done

while true; do
	echo "Press [CTRL+C] to stop.."
	sleep 1
done

while (( 1 )); do
	echo "Press [CTRL+C] to stop.."
	sleep 1
done

for (( ; ; )); do
   echo "Pres CTRL+C to stop..."
   sleep 1
done

=EOF=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/406.html

《用shell编写for/while循环》上的2个想法

发表评论

邮箱地址不会被公开。 必填项已用*标注