shell中for循环的基本结构为:
for arg in [list]
do
commands ...
done
如果do和for想在同一行,需要这样
for arg in [list] ;do
commands...
done
arg将顺次取得list中的变量
1.在list的位置上放入变量:
#!/bin/bash
FILES="/usr/sbin/accpet
/usr/sbin/pwck
/usr/sbin/chroot
/usr/sbin/fakefile
/sbin/badblocks
"
for file in $FILES
do
if [ ! -e "$file" ] #检查文件是否存在
then
echo "$file does not exist"
echo
continue
fi
ls -l $file | awk '{print $9" file size:"$5}' #用awk输出文件名和文件大小
whatis `basename $file` #注意这里的不是单引号,是ESC下边那个键
echo
done
2.如果for循环的list中有通配符*或?,将会产生文件名扩展
#!/bin/bash
echo
for file in * #将list设置为当前目录下pwd的所有文件,不包括以.开头的隐藏文件
do
ls -l $file
#如果想匹配.文件,可以执行shopt -s nullglob命令
done
echo
for file in [jx]* #删除以j或x开头的文件
do
rm -f $file
echo "Rename file /"$file/""
done
echo
exit 0
3.在for循环中,如果忽略list的话,将会使循环操作$@(命令行参数列表),即以$@作为list
#!/bin/bash
for a #没有[list]的话,循环操作"$@"
do
echo -n "$a"
done
echo
exit 0
4.也可以使用命令替换来产生for循环的[list]
#!/bin/bash
NUMBERS="9 7 3 8 37.53"
for number in `echo $NUMBERS`
do
echo -n "$number"
done
echo
exit 0
5.用命令替换[list]
#!/bin/bash
E_BADARGS=65
E_NOFILE=60
if [ $# -ne 2 ] #判断参数个数是否为2
then
exit $E_BADARGS
fi
if [ ! -f "$2" ] #判断第二个参数是否是一个文件名
then
echo "File /"$2/" does not exit"
exit $E_NOFILE
fi
IFS="/n"
for word int $(string "$2"|grep "$1")
#strings命令列出二进制文件中的所有字符串,输出到管道交个grep,然后由grep命令过滤
do
echo $word
done
exit 0
可以用以下命令来代替:
strings "$2"|grep "$1"|tr -s "$IFS"'[/n*]'
6.列出系统上所用的用户名
#!/bin/bash
PASSWORD_FILE=/etc/passwd
n=1
for name in $(awk 'BEGIN{FS=":"}{print $1}'<"$PASSWORD_FILE")
#域分隔符 =: #打印第一个域 #从/etc/passwd下获得用户名信息
do
echo "USER #$n=$name"
let "n+=1"
done
#输出结果:
#USER #1=root
#USER #2=bin
#...
exit 0
7.查找目录下的所有文件中查找字符串
#!/bin/bash
directory=/usr/bin
fstring="Free Software Foundation"
for file in $(find $directory -type -f -name '*'|sort)
do
strings -f $file | grep "$fstring" | sed -e "s%$directory%%"
done
#在"sed"表达式中,必须替换掉分隔符"/"。因为"/"也是sed的关键字。必须用"%"来替换
exit 0
8.for循环的输出可以通过管道传递到一个或多个命令中。比如列出指定目录中的所有符号连接文件:
#!/bin/bash
directory=${1-`pwd`} #` 不是单引号
#如果没有参数,则默认为当前的工作目录。
#下边的代码等价
#ARGS=1
# if [ $# -ne "$ARGS" ]
# then
# directory=`pwd` #获得当前目录
# else
# directory=$1
# fi
echo "symbolic link in directory /"$directory/""
for file in "$(find $directory -type l)" #如果不将find -type l用引号引用起来的话,如果有带空格的文件名,会被拆分成两个部分
do
echo "$file"
done | sort #否则输出的文件名是未经过排序的
exit 0
9.使用C风格的for循环,需要用到(())
#!/bin/bash
echo
#标准的shell语法
for a in 1 2 3 4 5 6 7 8 9
do
echo -n "$a" # -n 会阻止新行的产生
done
echo;echo
#C风格
LIMIT=10
for ((a=1;a<=LIMIT;a++))
#使用双圆括号,并且LIMIT前没有$符
do
echo -n "$a"
done
exit 0
转载网址 http://blog.csdn.net/vah101/article/details/6337922