SHELL编程实例
时间:2010-05-21 来源:jinngo
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命令读取变量数据2 -- read命令的使用方法 read命令从标准输入读取一行,并把输入行的每个字段(以指定的分隔符分隔)的值赋给命令行上的变量。
while read paraa parab parac
do
echo "PARAA:"$paraa
echo "PARAB:"$parab
echo "PARAC:"$parac
done < datafile.txt
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:baidu3 -- 参考资料 1、http://www.linuxsense.org/archives/63.html
PARAB:google
PARAC:tencent
PARAD:sina
PARAA:123456789
PARAB:
PARAC:
PARAD:
如何使用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