尝试在脚本中使用 wc(word count) 来计算文件的单词、字符、行数

尝试在脚本中使用 wc(word count) 来计算文件的单词、字符、行数

我正在尝试为我的操作系统课程编写一个 shell 脚本。但我无法让它读取文件的内容。似乎只阅读我为回答问题而输入的内容。不确定我错过了什么(看它非常简单)。提前谢谢你了。

echo "what file do you want to count? "
read file
mystring=$file
for token in $mystring;
do
    echo -n "lines: ";
    echo -n $token | wc -l;
    echo -n "words: ";
    echo -n $token | wc -w;
    echo -n "chars: ";
    echo -n $token | wc -c;
done

答案1

您编写的脚本将计算用户输入的字符串中的行数等,而不是与该文件名对应的文件中的行数等。

这是一个可以执行您希望它执行的操作的脚本,并且如果文件不存在或不是常规文件,还会发出错误消息:

#!/bin/sh

echo "Enter filename"
read fname

if [ ! -f "$fname" ]; then
    echo "No such file!" >&2
    exit 1
fi

lines=$( wc -l <"$fname" )
words=$( wc -w <"$fname" )
chars=$( wc -c <"$fname" )

printf 'The file "%s" has %d lines, %d words and %d characters\n' \
    "$fname" "$lines" "$words" "$chars"

为避免调用wc三次:

#!/bin/sh

echo "Enter filename"
read fname

if [ ! -f "$fname" ]; then
    echo "No such file!" >&2
    exit 1
fi

printf 'The file "%s" has %d lines, %d words and %d characters\n' \
    "$fname" $( wc <"$fname" )

这利用了默认输出行数、单词数和字符数的事实wc。如果你只是想像这样输出它们,这就足够了。

答案2

此代码不读取文件的内容。您在脚本中所做的事情是从用户那里获取文件名,然后将其存储在变量中($file以及稍后$mystring)。

当您运行时for token in $mystring,您将以列表的形式查看变量的内容$mystring,但它只有用户输入的文件名。因此,所有引用的命令$token都在操作从用户那里获得的字符串。

要操作文件内容,您可以使用cat@faadi: 所指出的 mystring=$(cat $file)

编辑:

只是纠正答案中的一些内容。我关注的是你没有阅读该文件,并且未能解决 @steeldriver 在他的评论中提出的另一个问题。如果您只是将行从 更改mystring=$file为,mystring=$(cat $file)您仍然无法实现您想要的效果,因为您最终会将文件的内容拆分在列表中并运行wc这些内容。

您可以删除 for 循环,使用这个(如果您想将文本存储在变量中并使用echo):

#!/bin/bash

echo "File to read:"
read file
mystring=$(cat $file)
echo ""
echo "TEXT:"
echo "$mystring"
echo ""
echo -n "Lines: "
echo "$mystring" | wc -l
echo -n "Words: "
echo "$mystring" | wc -w
echo -n "Chars: "
echo "$mystring" | wc -c

或者,正如 @steeldriver 建议的那样,只需将文件重定向到 STDIN,wc如下所示:

#!/bin/bash

echo "File to read:"
read file
echo ""
echo "TEXT:"
cat $file
echo ""
echo -n "Lines: "
wc -l < $file
echo -n "Words: "
wc -w < $file
echo -n "Chars: "
wc -c < $file

相关内容