文件读取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 <fd> | 指定读入数据的文件描述符,不再使用默认的标准输入。 |
-t <timeout> | 等待标准输入的超时时间,单位为秒。如果在指定的时间内没有输入,即时返回。 |
-p <prompt> | 打印提示符,等待输入,并将输入赋值给REPLY变量或者指定的变量。 |
-a <array> | 读入一组词,依次赋值给数组array。 |
-n <nchars> | 读取指定的字符数。如果已读取n个字符,马上返回,下次从返回点继续读取;如果已到行结束,无论满不满足n个字符都返回。 |
-d <delim> | 指定行结束符,读到该字符就当做一行的结束。 |
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、http://www.linuxsense.org/archives/63.html
如何使用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
---------------------------------------------
原文地址 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
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 若expr1和expr2都为真则整式为真
expr1 -o expr2 若expr1和expr2有一个为真则整式为真
特殊变量
$0 正在被执行命令的名字。对于shell脚本而言,这是被激活命令的路径
$n 该变量与脚本被激活时所带的参数相对应。n是正整数,与参数位置相对应($1,$2...)
$# 提供脚本的参数号
$* 所有这些参数都被双引号引住。若一个脚本接收两个参数,$*等于$1$2
$@ 所有这些参数都分别被双引号引住。若一个脚本接收到两个参数,$@等价于$1$2
$? 前一个命令执行后的退出状态
$$ 当前shell的进程号。对于shell脚本,这是其正在执行时的进程ID
$! 前一个后台命令的进程号