Shell(从文件中读取)
(2018-09-07 10:19:28)
使用read命令从文件读取数据的方法主要有两种,一种是在while循环或until循环中使用read命令,通过文件描述符一行一行地读取文件的内容。
在for循环中使用命令“cat ”读取文件的语法:
for data in $(cat filename)
do
command1
command2
...
commandN
done
filename代表一个文本文件,读取的内容会被存入变量data,此变量会在for循环体中使用,来对读入的数据进行处理。
使用这种方法读取文件内容的常见错误是,以为它是逐行地读取文件的内容,其实在默认情况下,它是逐个单词地读取文件内容。
因为使用这种方法读取文件内容时,它使用环境变量IFS的值作为分隔符,由于$IFS的默认值是“”,所以它会首先以空格作为分隔符来读取文件的内容。
因此,我们若要想使用这种方法逐行地读取文件内容时,需要在调用for循环之前先修改$IFS的值。
[root@aa ~]# cat readFromFilebyfor.sh
#!/bin/bash -
# 使用变量O_IFS来保存环境变量IFS的值
old_IFS==$IFS
# 如果指定的命令行参数个数不为1,则显示脚本的使用方法信息,然后退出脚本的执行
if [ $# -ne 1 ]
then
#
显示脚本的使用方法信息
echo "Usage:
`basename $0` filename"
#
退出脚本的执行
exit
fi
# 如果指定的文件不存在,则显示提示信息,并退出脚本的执行,退出状态码为1
if [ ! -f $1 ]
then
echo "The
file $1 doesn't exist!"
exit 1
fi
# 修改环境变量IFS的值,使用下面的for循环以换行符为分隔符来逐行地读取文件的内容
IFS=$'\n'
i=1
# 使用for循环来读取文件的内容,将读取的内容存入变量line
for line in $(cat $1)
do
echo
$i:$line
i=$(($i+1))
done
# 恢复环境变量IFS原来的值
IFS=$old_IFS
脚本运行结果:
[root@aa ~]# ./readFromFilebyfor.sh /etc/resolv.conf
1:#nameserver 124.172.244.212
2:nameserver 114.114.114.114
3:nameserver 8.8.8.8
[root@aa ~]#
在for循环中使用命令“cat ”读取文件的语法:
for data in $(cat filename)
do
done
filename代表一个文本文件,读取的内容会被存入变量data,此变量会在for循环体中使用,来对读入的数据进行处理。
使用这种方法读取文件内容的常见错误是,以为它是逐行地读取文件的内容,其实在默认情况下,它是逐个单词地读取文件内容。
因为使用这种方法读取文件内容时,它使用环境变量IFS的值作为分隔符,由于$IFS的默认值是“”,所以它会首先以空格作为分隔符来读取文件的内容。
因此,我们若要想使用这种方法逐行地读取文件内容时,需要在调用for循环之前先修改$IFS的值。
[root@aa ~]# cat readFromFilebyfor.sh
#!/bin/bash -
# 使用变量O_IFS来保存环境变量IFS的值
old_IFS==$IFS
# 如果指定的命令行参数个数不为1,则显示脚本的使用方法信息,然后退出脚本的执行
if [ $# -ne 1 ]
then
fi
# 如果指定的文件不存在,则显示提示信息,并退出脚本的执行,退出状态码为1
if [ ! -f $1 ]
then
fi
# 修改环境变量IFS的值,使用下面的for循环以换行符为分隔符来逐行地读取文件的内容
IFS=$'\n'
i=1
# 使用for循环来读取文件的内容,将读取的内容存入变量line
for line in $(cat $1)
do
done
# 恢复环境变量IFS原来的值
IFS=$old_IFS
脚本运行结果:
[root@aa ~]# ./readFromFilebyfor.sh /etc/resolv.conf
1:#nameserver 124.172.244.212
2:nameserver 114.114.114.114
3:nameserver 8.8.8.8
[root@aa ~]#

加载中…