我是 Bash 脚本的新手,需要以下方面的帮助:
这项作业的目的是让学生用 bash 脚本语言编写程序,使他们能够像数据库表一样操作文本文件中的数据。
学生应该了解表结构并使用 bash 脚本语言编写程序 check_table、row_select 和 row_delete。
表格结构 表格由包含多行文本文件组成。第一行包含表格信息,其余每行代表一行数据。
第一行结构如下:
table_name:number_of_rows:number_of_fields:fieldname1,fieldname2,filedname3 ...etc
- table_name 为不超过 16 个字符的字母数字字符串,且不包括列字符 ':' 和空格字符 ' '。必须与文件名相同。
- number_of_rows 是一个小于 1000 的整数。
- number_of_fields 是一个小于 10 的整数。
- filedname 是一个不超过 16 个字符的字母数字字符串,不包括空格“ ”和逗号“,”字符。
每个数据行由一系列以逗号字符“,”分隔的字段组成。每行的字段数与表中所有其他字段数完全相同。字段由一串字母数字字符组成,不超过 16 个字符,并且不包含空格字符“ ”或逗号字符“,”。
例子:
students_info:3:5:std_1st_name,std_last_name,year_ of_birth,sex,program
amer,salim,1990,m,bit
samira,rami,1988,f,ise
lamia,rida,1990,f,ise
程式
1.检查表
syntax: check_table <table_name>
描述:
该程序按顺序检查以下内容:
- 命令语法
- 表已存在。
- 第一行语法正确。
- 表名和字段名都有正确的长度。
- 表格的行数正确。
- 所有行都有正确数量的字段。
输出:
- 桌子很好
- 表有一个问题问题描述(遇到的第一个问题)
例子:
$ check_table students_info
table students_info is good
$ check_table student_info1
table students_info has at least one problem:
Actual number of rows not equal to the one in the file header.
我需要一些关于此的指南。
提前致谢。
答案1
你至少应该从学习 bash 的基础知识开始。我建议你阅读http://mywiki.wooledge.org/BashGuide。
阅读完本指南后,您将需要了解如何逐行和/或逐字段解析文本文件,这将Bash 常见问题 1解释道。
您还需要做一些字符串操作。Bash 常见问题 100应该涵盖这一点。
答案2
为了帮助您入门,请将其保存在文件中并设置执行模式,然后在终端中运行它。查看输出并将其与脚本进行比较。看看您是否能理解它是如何关联的。使用已经建议的参考资料来提供帮助。
#!/bin/bash
if [[ $# != 1 ]]
then
echo usage $0 "<table_to_check>"
exit 1
fi
error=""
firstline=1
{
while read line # loop through the lines
do
# check syntax of "line"
if(($firstline))
then
#check first line syntax
echo information row=$line # debug
# ... your method here. Assign to error if something is wrong...
firstline=0 # ready for next line/loop which should be data
else
#check other lines
echo data row=$line # debug
# ... your method here. Assign to error if something is wrong...
fi
if [[ $error != "" ]] # assign any error in the data as a string message you can then print here and exit
then
echo $error
exit 2
fi
done
} < "$1"
exit 0 # no error
为了实现字段检查,也许需要cut
将行分解为单独的标记,例如在信息行中:
number_of_rows=`echo $line | cut -d':' -f2`
并且给定样本,$number_of_rows 应该包含“3”
因此,为了检查这是否正确,您可以使用一个在每次循环时递增的计数器:
rowcount=$[rowcount+1]
当没有更多数据时,$rowcount 应该等于 $number_of_rows,因此:
if (( $rowcount != $number_of_rows ))
then
error="number of rows doesn't agree"
# ... etc ...
类似这样的。
当然还有其他方法