![尝试在脚本中使用 wc(word count) 来计算文件的单词、字符、行数](https://linux22.com/image/98437/%E5%B0%9D%E8%AF%95%E5%9C%A8%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%20wc(word%20count)%20%E6%9D%A5%E8%AE%A1%E7%AE%97%E6%96%87%E4%BB%B6%E7%9A%84%E5%8D%95%E8%AF%8D%E3%80%81%E5%AD%97%E7%AC%A6%E3%80%81%E8%A1%8C%E6%95%B0.png)
我正在尝试为我的操作系统课程编写一个 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