【问题标题】:Unix shell to prompt user for filenameUnix shell 提示用户输入文件名
【发布时间】:2012-09-02 09:10:28
【问题描述】:

请见谅,因为我是 UNIX 初学者。

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

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

echo "Your file has $result lines"

但是,我无法让它工作,因为它抱怨标识符“文件名”。高手能帮忙吗?谢谢!!

【问题讨论】:

    标签: shell unix


    【解决方案1】:

    这很好用,至少在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有不同的做事方式。

    【讨论】:

    • 要让 wc 只打印数字,wc -l &lt; $filename 看起来比 cat 更优雅
    • @glennjackman:您不需要 STDIN 重定向——wc -l $filename 也可以:)。
    • @jmdeldin,问题在于wc -l infile 的输出是12345 infile - 它还包含输入文件名。如果您只想要数字,您可以使用awk(另一个进程)之类的东西对其进行后处理,或者使用标准输入(cat infile | wc ...,另一个进程,或&lt; infile,无需额外进程)删除文件名。
    • @paxdiablo:啊,谢谢你的澄清。心理外壳脚本......不是那么有效。
    【解决方案2】:

    如果你想评估 wc -l $filename ,你不必这样做:

    result=$(wc -l $filename)
    

    否则,如果 result=wc -l $filename,bash 会将 wc 分配给 result,并将下一个单词 (-l) 解释为要运行的命令。

    【讨论】:

      【解决方案3】:

      给你:

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

      【讨论】:

        猜你喜欢
        • 2013-04-30
        • 2013-03-13
        • 2010-10-01
        • 2012-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-26
        相关资源
        最近更新 更多