Unix shell提示用户输入文件名

3

由于我是UNIX初学者,请多包涵。

我想编写一个shell脚本,可以让用户输入文件名并输出该文件中行数的数量。以下是我的代码:

echo "Pls enter your filename:"
read filename
result=wc -l $filename

echo "Your file has $result lines"

然而,由于标识符“filename”引起了问题,我无法让它工作。 专家能帮忙吗?谢谢!!
3个回答

6

这在bash中可以正常工作。好的,read可以正常工作。然而,对于result的赋值可能应该是:

result=$(wc -l $filename)

但是,由于该命令同时输出行数和文件名,您可能需要稍微更改一下,只获取行数,例如:

result=$(cat $filename | wc -l)

或者:

result=$(wc -l <$filename)

您所拥有的命令:

result=wc -l $filename

该命令将会把result设置为字面值wc,并尝试执行-l命令。

例如,以下五行脚本:

#!/bin/bash
echo "Pls enter your filename:"
read filename
result=$(cat $filename | wc -l)
echo "Your file has $result lines"

当运行并将其名称作为输入时,将生成以下内容:

Your file has 5 lines

如果你没有使用bash,你需要指定你正在使用哪个shell。不同的shell有不同的做事方式。


2
要让wc只打印数字,“wc -l < $filename”比“cat”更优雅。 - glenn jackman
@glennjackman:你不需要STDIN重定向-- wc -l $filename也可以完成任务 :)。 - jmdeldin
2
@jmdeldin,问题在于wc -l infile的输出是12345 infile,它包含了输入文件名。如果你只想要数字,可以使用类似awk的后处理方式(另一个进程),或者使用stdin来删除文件名(cat infile | wc ...,另一个进程,或者使用< infile不需要额外的进程)。 - paxdiablo
@paxdiablo:啊,感谢澄清。在头脑中编写脚本并不是很有效。 - jmdeldin

1

这是您需要的:

echo "Pls enter your filename:" 
read filename 
result=`wc -l $filename | tr -s " " | cut -f2 -d' '`

echo "Your file has $result lines"

1
如果你想要评估 wc -l $filename,你需要做以下事情:
result=$(wc -l $filename)

否则,使用 result=wc -l $filename 命令时,Bash 会将 wc 赋值给 result,并将下一个单词(-l)解释为要运行的命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接