Unix shell提示用户输入文件名

Kev*_*vin 3 unix shell

由于我是UNIX初学者,请原谅。

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

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

echo "Your file has $result lines"
Run Code Online (Sandbox Code Playgroud)

但是,由于它抱怨标识符“文件名”,我无法使其正常工作。专家可以帮忙吗?谢谢!

pax*_*blo 5

至少在中有效bash。好吧,read作品很好。但是,对的分配result可能应该是:

result=$(wc -l $filename)
Run Code Online (Sandbox Code Playgroud)

但是,由于该命令同时输出了行数文件名,因此您可能需要稍作更改以获取行数,例如:

result=$(cat $filename | wc -l)
Run Code Online (Sandbox Code Playgroud)

要么:

result=$(wc -l <$filename)
Run Code Online (Sandbox Code Playgroud)

您拥有的命令:

result=wc -l $filename
Run Code Online (Sandbox Code Playgroud)

将设置result为文字wc,然后尝试执行-l命令。

例如,以下五行脚本:

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

在运行并给出其名称作为输入时,将产生以下内容:

Your file has 5 lines
Run Code Online (Sandbox Code Playgroud)

如果您使用bash,则需要指定要使用的外壳。不同的外壳具有不同的处理方式。

  • 为了使wc只打印数字,`wc -l &lt;​​$ filename`看起来比`cat`更优雅。 (2认同)
  • @jmdeldin,问题是wc -l infile的输出是12345 infile-它也包含输入文件名。如果只需要数字,则可以使用“ awk”(另一个进程)之类的东西对其进行后处理,或者通过使用stdin(另一个进程“ cat infile | wc ...”或“ &lt;infile”)删除文件名。 `,无需任何额外的处理)。 (2认同)