Bash 假设文件名作为命令行参数给定。编写一个shell脚本来计算行数、字符数和单词数

Bash 假设文件名作为命令行参数给定。编写一个shell脚本来计算行数、字符数和单词数,bash,shell,unix,Bash,Shell,Unix,我试图解决这个问题,但我无法解决最后一部分,即“假定文件名作为命令行参数提供” 编写一个shell脚本,显示文件中的字、字符和行的总数。假设文件名作为命令行参数给定 echo c=$( wc -c < test.txt) echo "Number of characters in test.txt is $c" echo w=$( wc -w < test.txt) echo "Number of words in test.txt is $w" echo l=$( ec -l &l

我试图解决这个问题,但我无法解决最后一部分,即“假定文件名作为命令行参数提供”

编写一个shell脚本,显示文件中的字、字符和行的总数。假设文件名作为命令行参数给定

echo
c=$( wc -c < test.txt)
echo "Number of characters in test.txt is $c"
echo
w=$( wc -w < test.txt)
echo "Number of words in test.txt is $w"
echo
l=$( ec -l < test.txt)
echo "Number of lines in test.txt is $l"
echo
c=$(wc-c

我必须通过两个测试用例,但我只通过了一个测试用例,因为假设文件名是命令行参数,我无法解决这个问题。

这应该可以。按如下所示编写一个脚本,\u script.sh:

echo
c=$( wc -c < test.txt)
echo "Number of characters in test.txt is $c"
echo
w=$( wc -w < test.txt)
echo "Number of words in test.txt is $w"
echo
l=$( ec -l < test.txt)
echo "Number of lines in test.txt is $l"
for F in ${*}
do
   echo
   c=$( wc -c < ${F})
   echo "Number of characters in ${F} is $c"
   echo
   w=$( wc -w < ${F} )
   echo "Number of words in ${F} is $w"
   echo
   l=$( wc -l < ${F})
   echo "Number of lines in ${F} is $l"
done
正如其他人所指出的,如果文件很大,您应该避免运行
wc
三次,因此这里有一种方法可以只运行一次并处理计数:

WC=$( wc ${F} )
l=$( echo $WC | awk '{print $1}' )
w=$( echo $WC | awk '{print $2}' )
c=$( echo $WC | awk '{print $3}' )
passed=$1
回音
echo-n“已传递的$中的字符数为”
wc-c<$通过
回音
echo-n“以$passed为单位的字数为”
wc-w<$通过
回音
echo-n“以$passed为单位的字母数为”
wc-l<$通过
${*}中D的

做
回声
c=$(wc-c<${D})
echo“${D}中的字符数为$c”
回声
w=$(wc-w<${D})
echo“${D}中的字数为$w”
回声
l=$(wc-l<${D})
echo“${D}中的行数为$l”
完成
这将起作用

#/bin/bash
echo“$1`wc-m中的字符数<$1`”
echo“$1`wc-w中的字数<$1`”
echo“$1`wc-l中的行数<$1`”
  • $1:第一个参数(文件名)
  • `(反引号):用于执行命令
  • 选项: -m:数个字符 -w:数一数单词 -l:数行

  • **您也可以使用这种简单的格式**

    for F in test.txt
       do 
            echo
            c=$( wc -c < test.txt )
            echo "number in test.txt is $c"
        done
    
    test.txt中F的
    
    做
    回声
    c=$(wc-c
    echo“$1中的字符数为$(wc-m<$1)”
    echo“$1中的字数为$(wc-w<$1)”
    echo“$1中的行数为$(wc-l<$1)”
    
    打印时需要将test.txt替换为$1。
    这将清除这两个测试用例。

    试试这一个,它工作正常。所有测试均已通过

    for F in $*
    
    do
    
      echo
    
      c=$( wc -c < ${F} )
    
      echo "Number in characters in ${F} is $c"
    
      echo
    
      w=$( wc -w < ${F} )
    
      echo "Number in words in ${F} is $w"
    
      echo
    
      l=$( wc -l < ${F} )
    
       echo "Number in lines in ${F} is $l"
    
    done
    
    F in的
    $*
    做
    回声
    c=$(wc-c<${F})
    echo“${F}中字符数为$c”
    回声
    w=$(wc-w<${F})
    echo“在${F}中的字数为$w”
    回声
    l=$(wc-l<${F})
    echo“${F}中的行数为$l”
    完成
    
    使用这个简单的解决方案:

    wc -c ${*} | awk '{print "Number of characters in " $2 " is " $1}'
    wc -w ${*} | awk '{print "Number of words in " $2 " is " $1}' 
    wc -l ${*} | awk '{print "Number of lines in "$2 " is " $1}'
    

    基本上,它给出了一个问题,即文件名将通过命令行参数传递。因此,基本上您可以通过将该命令行参数用作变量来打印文件名(并非所有测试用例都是test.txt)。 这是我在tekstac平台上接受的代码-

    words=`cat $1 | wc -w`
    char=`cat $1 | wc -c`
    lines=`cat $1 | wc -l`
    echo "Number of characters in $1 is $char"
    echo "Number of words in $1 is $words"
    echo "Number of lines in $1 is $lines"
    

    提示:传递给脚本的第一个命令行参数是
    $1
    。无需运行
    wc
    三次。最后一个有打字错误!检查手册页面中的
    wc
    。你会发现你不需要这些选项。在谷歌上搜索“如何编写带参数的bash脚本”。这并不难。永远不要使用名为
    l
    的变量,因为它看起来太像数字
    1
    (在某些字体中无法区分),因此会混淆代码。您希望
    “$@”
    ,而不是不带引号的
    $*
    ,来处理所有有效参数。您还需要引用
    $F
    。虽然此代码可以回答问题,但提供有关此代码回答问题的原因和/或方式的其他上下文可以提高其长期价值。请修复格式(作为代码),并解释您的代码请不要仅将代码作为答案发布,但要说明代码的作用以及如何解决问题。带有解释的答案通常质量更高,更有可能吸引更多的选票。
     echo "Number of characters in $1 is $(wc -m < $1)"
     echo "Number of words in $1 is $(wc -w < $1)"
     echo "Number of lines in $1 is $(wc -l < $1)"
    
    for F in $*
    
    do
    
      echo
    
      c=$( wc -c < ${F} )
    
      echo "Number in characters in ${F} is $c"
    
      echo
    
      w=$( wc -w < ${F} )
    
      echo "Number in words in ${F} is $w"
    
      echo
    
      l=$( wc -l < ${F} )
    
       echo "Number in lines in ${F} is $l"
    
    done
    
    wc -c ${*} | awk '{print "Number of characters in " $2 " is " $1}'
    wc -w ${*} | awk '{print "Number of words in " $2 " is " $1}' 
    wc -l ${*} | awk '{print "Number of lines in "$2 " is " $1}'
    
    words=`cat $1 | wc -w`
    char=`cat $1 | wc -c`
    lines=`cat $1 | wc -l`
    echo "Number of characters in $1 is $char"
    echo "Number of words in $1 is $words"
    echo "Number of lines in $1 is $lines"