Linux Bash shell学习笔记7(for循环)

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值