Chinaunix首页 | 论坛 | 博客
  • 博客访问: 252734
  • 博文数量: 58
  • 博客积分: 2241
  • 博客等级: 大尉
  • 技术积分: 522
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-07 09:53
文章分类
文章存档

2012年(4)

2011年(19)

2010年(31)

2009年(4)

分类: LINUX

2010-05-21 09:39:14

文件读取

1 -- SHELL读取文件的方法
#使用read命令读取一行数据
while read myline
do
echo "LINE:"$myline
done < datafile.txt
#使用read命令读取一行数据
cat datafile.txt | while read myline
do
echo "LINE:"$myline
done
#读取一行数据
cat datafile.txt | while myline=$(line)
do
echo "LINE:"$myline
done
#读取一行数据
while myline=$(line)
do
echo "LINE:"$myline
done < datafile.txt
#使用read命令读取变量数据
cat datafile.txt | while read paraa parab parac
do
echo "PARAA:"$paraa
echo "PARAB:"$parab
echo "PARAC:"$parac
done
#使用read命令读取变量数据
while read paraa parab parac
do
echo "PARAA:"$paraa
echo "PARAB:"$parab
echo "PARAC:"$parac
done < datafile.txt
2 -- read命令的使用方法
read命令从标准输入读取一行,并把输入行的每个字段(以指定的分隔符分隔)的值赋给命令行上的变量。
read [-ers] [-u fd] [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] [name ...] 

参数解析:
-e  
-r 指定读取命令把“\”(反斜杠)做为输入行的一个普通字符,而非控制字符。
-s 安静模式。如果指定该参数且从终端读入数据,那么输入的时候将不回显在屏幕上。
-u 指定读入数据的文件描述符,不再使用默认的标准输入。
-t 等待标准输入的超时时间,单位为秒。如果在指定的时间内没有输入,即时返回。
-p 打印提示符,等待输入,并将输入赋值给REPLY变量或者指定的变量。
-a 读入一组词,依次赋值给数组array。
-n 读取指定的字符数。如果已读取n个字符,马上返回,下次从返回点继续读取;如果已到行结束,无论满不满足n个字符都返回。
-d 指定行结束符,读到该字符就当做一行的结束。
name ... 指 定read变量。read读取一行数据后,分隔行数据为各个字段,然后将字段依次赋给指定的变量。如果分隔后的字段数目比指定的变量多,那么将把剩余的全 部字段值都赋给最后的那个变量;反之,剩余的变量被赋值为空字符串。如果read没有指定变量,系统使用默认的REPLY作为缺省变量名。

使用重定向读取数据
exec 6< datafile.txt
while read -u 6 myline
do
echo "LINE:"$myline
done

变量分隔符
read命令默认的分隔符是空格,多个空格被当做一个空格处理。我们也可以使用IFS(内部字段分隔符)指定的的字符作为分隔符。假如有如下内容的一个文件,它以“$”来分隔变量,希望把每个变量区别开来,可以使用如下脚本:
baidu$google$tencnt$sina
123456789
#使用read命令读取变量数据
while read paraa parab parac parad
do
echo "PARAA:"$paraa
echo "PARAB:"$parab
echo "PARAC:"$parac
echo "PARAD:"$parad
done < datafile.txt
执行脚本的输出如下:
PARAA:baidu
PARAB:google
PARAC:tencent
PARAD:sina
PARAA:123456789
PARAB:
PARAC:
PARAD:
3 -- 参考资料
1、


如何使用read命令读取文件的每一行

下面是一个简单的例子程序,展示如何用read命令读取文件的每一行,并且把它输出到控制台。
如果没有输入文件,那么自身的shell文件将被使用
#!/bin/sh

if [ $# -gt 1  ]; then
    echo "Usage: $0 [FileName]"
    exit 1
elif [ $# -eq 1 ]; then
    MY_FILE=$1
else
    MY_FILE=$0
fi

if [ ! -f $MY_FILE ]; then
    echo "$MY_FILE does not exist!"
    exit 2
fi

MY_LINE_NO=1
while read MY_LINE
do
    printf "%5.5d: $MY_LINE\n" $MY_LINE_NO
    MY_LINE_NO=$((MY_LINE_NO+1))
done < $MY_FILE



---------------------------------------------
虽然这个东西看起来很简单,但是很多人有的时候会忘记它的正确使用
while read MY_LINE < $MY_FILE
do
printf "%5.5d: $MY_LINE\n" $MY_LINE_NO
MY_LINE_NO=$((MY_LINE_NO+1))
done
这样的结果很显然,每次都读$MY_FILE的第一行,并且是一个死循环,永远不会退出。

 

       原文地址 http://blog.chinaunix.net/u/29141/showart_372963.html

shell的数组

Bash中,数组变量的赋值有两种方法:

  (1) name = (value1 ... valuen) 此时下标从0开始

  (2) name[index] = value

  下面以一个简单的脚本来说明,脚本内容如下:

  #!/bin/bash

  #定义数组

  A=(a b c def)

  #把数组按字符串显示输出

  echo ${A[@]}

  #屏幕显示:a b c def

  #数组的长度表示${#A[*]}

  len=${#A[*]}

  echo ${#A[*]}

  #屏幕显示:4

  #改变数组元素的值

  A[3]='vivian'

  echo ${A[*]}

  #屏幕显示:a b c vivian

  #循环输出数组元素

  i=0

  while [ $i -lt $len ]

  do

  echo ${A[$i]}

  let i++

  done

  #屏幕输出:

  #      a

  #       b

  #      c

  #     vivian

  #循环输出数组元素的另一种写法,注意,在条件中,引用变量一定要用双引号 ,否则报错

  for (( j=0; j<"$len"; j=j+1 ))

  do

  echo ${A[$j]}

  done

  #循环输出数组元素的另一种写法,注意,${A[*]}不能写成$A ,$A默认是第一个元素,如果A="a b c ded",就可以写$A

  for value in ${A[*]}

  do

  echo $value

  done

----------------------------------------------------------

shell遍历目录

#!/bin/sh

for file in ./*               遍历的文件是当前目录,其他目录可以通过修改这个参数来实现
do
if test -f $file
then
    echo $file
    echo 是文件
fi
if test -d $file
then
    echo $file
    echo 是目录
fi
done

----------------------------------------------------------

cd .


myfun()
{       

        for i in `ls`
        do
                if [ -f $i ] ; then
                        echo $i
#                       string=`cat $i | grep "keyword"`
#                        if [ "$string" ] ; then
#                                echo "$PWD/$i"    #找到了包含关键字的文件
#                                #echo "Debug: $PWD/$i is a file and find the keyword in the file!!"
#                        fi
#                        #echo "Debug: $PWD/$i is a file and doesn't find the keyword in the file!!"
                else
                        #echo "Debug: $PWD/$i is a directory!!"
                        if [ -d $i ] ; then    #ls命令会导致一些不存在的文件出现,需要剔除
                                cd $i
                                myfun
                                cd ..
                        else
                                echo "$PWD/$i is not existence!"
                        fi
                fi
                #echo "$PWD done"
        done
}

myfun

还可以用basename $i, dirname $i来打印文件名和路径

-----------------------
#!/bin/sh

# 定义一个方法
foreachd(){
# 遍历参数1
for file in $1/*
do
# 如果是目录就打印处理,然后继续遍历,递归调用
        if [ -d $file ]; then
                echo $file
                foreachd $file
        fi
done
}

# 执行,如果有参数就遍历指定的目录,否则遍历当前目录
echo "parameter in = $#"
echo "parameter 0= $0"
echo "parameter 1= $1"
echo "parameter 2= $2"

if [ $# -gt "0" ];then
        echo "p1 > 0"
    foreachd "$1"
else
    foreachd "."
fi

Shell 条件判断总结

时间:2007-08-03 10:53:18  来源:  作者:

UNIX Shell 编程

一些条件判断 总结

-b file            若文件存在且是一个块特殊文件,则为真
-c file           
若文件存在且是一个字符特殊文件,则为真
-d file           
若文件存在且是一个目录,则为真
-e file           
若文件存在,则为真
-f file           
若文件存在且是一个规则文件,则为真
-g file           
若文件存在且设置了SGID位的值,则为真
-h file           
若文件存在且为一个符合链接,则为真
-k file           
若文件存在且设置了"sticky"位的值
-p file           
若文件存在且为一已命名管道,则为真
-r file           
若文件存在且可读,则为真
-s file           
若文件存在且其大小大于零,则为真
-u file           
若文件存在且设置了SUID位,则为真
-w file           
若文件存在且可写,则为真
-x file           
若文件存在且可执行,则为真
-o file           
若文件存在且被有效用户ID所拥有,则为真

-z string          string长度为0,则为真
-n string         
string长度不为0,则为真
string1 = string2 
若两个字符串相等,则为真
string1 != string2
若两个字符串不相等,则为真

int1 -eq int2      int1等于int2,则为真
int1 -ne int2     
int1不等于int2,则为真
int1 -lt int2     
int1小于int2,则为真
int1 -le int2     
int1小于等于int2,则为真
int1 -gt int2     
int1大于int2,则为真
int1 -ge int2     
int1大于等于int2,则为真

!expr              expr为假则复合表达式为真。expr可以是任何有效的测试表达式
expr1 -a expr2    
expr1expr2都为真则整式为真
expr1 -o expr2    
expr1expr2有一个为真则整式为真

特殊变量

$0                 正在被执行命令的名字。对于shell脚本而言,这是被激活命令的路径
$n                
该变量与脚本被激活时所带的参数相对应。n是正整数,与参数位置相对应($1,$2...)
$#                
提供脚本的参数号

$*                
所有这些参数都被双引号引住。若一个脚本接收两个参数,$*等于$1$2
$@                
所有这些参数都分别被双引号引住。若一个脚本接收到两个参数,$@等价于
$1$2
$?                
前一个命令执行后的退出状态

$$                
当前shell的进程号。对于shell脚本,这是其正在执行时的进程ID
$!                
前一个后台命令的进程号

阅读(1516) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~