任务描述
本关任务:使用Shell编程读取给定目录下的myText.txt文件,按行计算每行字符的个数并将计算结果输出到/home目录下的result.txt文件中,该文件需要您自行创建。
相关知识
为了完成本关任务,你需要掌握:1.如何使用Shell读取文件内容;如何使用Shell创建文件并写入内容。
Shell 读取文件内容
- 方法一:重定向
while read myline # 逐行读取文件
- `do``
- `` echo $myline`
- done < myText.txt`
重定向是指将用户在终端输入的命令执行的结果输出到指定文件,而不是在终端展示;或将文件中的内容代替键盘输入提交给指定的命令执行。重定向命令包含:
命令 | 说明 |
command > file | 将输出重定向到file |
command < file | 将输入重定向到file |
command >> file | 将输出以追加方式重定向到file |
n > file | 将文件描述符为n的文件重定向到file |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file |
方法二:管道
cat myText.txt | while read line
do
echo $line
done
cat
(英文:concatenate)命令用于连接文件并将文件内容打印到标准输出设备上。语法格式如下: cat [-参数] [--help] [--version] fileName
参数 | 说明 |
-n | 从1开始对所有输出的行数编号 |
-b | 和-n类似,但空白行不编号 |
-s | 当遇到连续2行以上的空白行时展示1行空白行 |
-E | 每行结尾处显示$符号 |
-T | 将Tab字符显示为^ |
实例:
cat -n textfile1 > textfile2 # 将textfile1的内容加上行号后输入到textfile2这个文档里 cat -b textfile1 textfile2 >> textfile3 # 将 textfile1和textfile2的内容加上行号后追加输入到textfile3这个文档里 cat /dev/null > /home/test.txt # 清空/home/test.txt 文档的内容
管道命令(使用|
符号表示)能够把一个进程的输出数据连接到另一个进程的输入,使用格式如下: command1 | command2
实例:
ls | grep myText.txt # 将ls的输出发送到grep命令,即查看文件myText.txt是否存在于当前目录
- 方法三:通过cat + IFS重定义
IFS_old=$IFS
IFS=$'\n'
- ``for line in $(cat myText.txt)`
do
echo $line
done
IFS=$IFS_old
默认情况下,Bash Shell将空格、制表符、换行符看作是字段分隔符,遇到这些字符Bash Shell就会认为这些字符后是一个新的字段。IFS是Shell的环境变量,它定义了当前的分隔符,通过改变IFS的值可以改变分隔符。
Shell 创建文件的方法
- 方法一:通过vim命令创建
vim test.txt
vim命令可以用vim编辑器直接打开一个已经存在的文件进行编辑,若文件不存在则先创建一个缓存文件,随后用户可以在vim编辑器进行编辑。 - 方法二:通过echo命令创建文件
echo "Hello,openEuler!" > myText.txt
以上命令可以将echo输出的内容重定向至指定文件。 - 方法三:通过touch命令创建文件
touch myText.txt
touch命令创建的是一个空文件。
Shell 写文件
- 方法一:vim命令
vim myText.txt
与创建文件的方法一类似,vim命令可以使用编辑器打开文件,用户输入i
后即可键入文件内容,编辑完成后按下Esc
键并输入:wq
,回车即可保存并退出编辑器。 - 方法二:重定向
echo "Hello,openEuler!" > myText.txt
与创建文件的方法二类似,可以使用echo+重定向的方式向文件中写入内容。重定向>
符号写入文件是以覆盖的方式写入,若想实现追加写入,则可以将>
改为>>
。
编程要求
根据提示,在右侧编辑器补充代码,计算每行出现数字的个数并将结果输出到/home/result.txt文件中。
测试说明
平台会对你编写的代码进行测试:
假设myText.txt内容如下:
abc defg# 2
h i jklm # 3
no # 1
p qrst # 2
u v w syz # 4
那么写入的result.txt文件内容应为:
2
3
1
2
4
开始你的任务吧,祝你成功!
#!/bin/bash touch /home/result.txt sum=0 f1=0 f2=1 #-e 开启echo的转义功能,尾部加\c表示不换行 echo -e "$f1+$f2\c" #使用expr执行加法 sum=`expr $sum + $f1 + $f2` #shell脚本中的for循环 for i in $(seq 3 10) do f3=`expr $f1 + $f2` sum=`expr $sum + $f3` f1=$f2 f2=$f3 echo -e "+$f3\c" done echo -e "=$sum"