添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Harry Potter - The Half Blood Prince:J.K Rowling:40.30:10:50
The little Red Riding Hood:Dan Lin:40.80:20:10
Harry Potter - The Phoniex:J.K Rowling:50.00:30:20
Harry Potter - The Deathly Hollow:Dan Lin:55.00:33:790
Little Prince:The Prince:15.00:188:9
Lord of The Ring:Johnny Dept:56.80:100:38

我实际上打算 1) 逐行读取文件并将其存储在一个数组中 2) 显示它

然而,我不知道如何启动第一个项目。 通过在网上做研究,以下是我到现在为止所写的代码。

#!/bin/bash
function fnReadFile()
while read inputline
 bTitle="$(echo $inputline | cut -d: -f1)"
 bAuthor="$(echo $inputline | cut -d: -f2)"
 bPrice="$(echo $inputline | cut -d: -f3)"
 bQtyAvail="$(echo $inputline | cut -d: -f4)"
 bQtySold="$(echo $inputline | cut -d: -f5)"
 bookArray[Count]=('$bTitle', '$bAuthor', '$bPrice', '$bQtyAvail', '$bQtySold')
Count = Count + 1
function fnInventorySummaryReport()
fnReadFile
echo "Title                  Author           Price          Qty Avail.      Qty Sold      Total Sales"
for t in "${bookArray[@]}"
echo $t
echo "Done!"
if ! [ -f BookDB.txt ] ; then #check existance of bookdb file, create the file if not exist else continue
touch BookDB.txt
"HERE IT WILL THEN BE THE MENU AND CALLING OF THE FUNCTION"

提前感谢那些提供帮助的人!

5 个评论
我刚刚发布的这一大块代码存在错误。
什么错误?如果你把它们添加到问题中,我们就会更容易帮助你。
第12行:bookArray[Count]:不能将列表分配给数组成员
error occurs in this line > bookArray[Count]=('$bTitle', '$bAuthor', '$bPrice', '$bQtyAvail', '$bQtySold')
bash没有多维数组。如果这是你真正想要的,请使用具有更灵活数据结构的语言,比如Perl。
linux
arrays
shell
unix
ubuntu
Andres
Andres
发布于 2012-01-25
2 个回答
William Pursell
William Pursell
发布于 2012-01-25
已采纳
0 人赞同

你为什么要把整个东西读成一个数组呢? 当你需要信息时,可以查询该文件。

#!/bin/sh # untested code: # print the values of any line that match the pattern given in $1 grep "$1" BookDB.txt | while IFS=: read Title Author Price QtyAvailable QtySold; do echo title = $Title echo author = $Author

除非你的文本文件非常大,否则你不太可能需要数组中的数据。 如果它大到你出于性能的原因需要这样做,你真的不应该在sh中进行编码。

这就是我所要做的。你不能把一个表读到一个数组中,只能读到一行,所以从文件中一次只提取一行是有意义的......这时你不妨直接处理它。顺便说一下,你可能想要一个while IFS=: read ... ; do ... done < <(grep ...)的结构,所以while里面的变量是脚本其余部分的一部分。
这是我第一次为它写程序,所以请原谅我,上面这一大块代码,我应该用哪一部分来代替? 我还需要切割功能吗?
@Andres 你根本不需要切割。 使用带有IFS=:的读法可以为你完成所有这些工作。
@sorpigal 进程替换是一种bash主义,有时很方便,但应该让OP知道它不具有可移植性。 (移植性通常不会成为一个问题,直到之后你已经写了几万行的代码,却发现自己在调试它们的bashisms!)
@WilliamPursell:这个问题是针对Linux的,所以是bash。
Dan Fego
Dan Fego
发布于 2012-01-25
0 人赞同

既然你在这里的目标似乎很明确,那么用awk来替代使用bash的数组如何?通常情况下,使用正确的工具来完成工作会使事情变得更容易!

下面的awk脚本应该可以得到类似你想要的东西。

# This will print your headers, formatted the way you had above, but without
# the need for explicit spaces.
BEGIN {
    printf "%-22s %-16s %-14s %-15s %-13s %s\n", "Title", "Author", "Price",
    "Qty Avail.", "Qty Sold", "Total Sales"
# This is described below, and runs for every record (line) of input
    printf "%-22s %-16s %-14.2f %-15d %-13d %0.2f\n",
    substr($1, 1, 22), substr($2, 1, 16), $3, $4, $5, ($3 * $5)

第二部分的代码(在大括号之间)为每一行输入运行。printf是用于格式化输出的,使用给定的格式字符串来打印每个字段,用$1$2等表示。在awk中,这些变量被用来访问你的记录(本例中为行)的字段。替换代码8】是用来截断输出的,如下图所示,但如果你不介意字段不排成一行,可以很容易地删除。我认为 "销售总额 "应该是价格乘以销售数量,但你也可以很容易地更新它。

然后,你把这个文件保存在books.awk中,像这样调用这个脚本。

$ awk -F: -f books.awk books
Title                  Author           Price          Qty Avail.      Qty Sold      Total Sales
Harry Potter - The Hal J.K Rowling      40.30          10              50            2015.00
The little Red Riding  Dan Lin          40.80          20              10            408.00
Harry Potter - The Pho J.K Rowling      50.00          30              20            1000.00
Harry Potter - The Dea Dan Lin          55.00          33              790           43450.00
Little Prince          The Prince       15.00          188             9             135.00
Lord of The Ring       Johnny Dept      56.80          100             38            2158.40