在wc失败的情况下获取shell脚本中文件的行数

时间:2017-12-28 09:12:23

标签: bash shell cat wc

我的脚本检查参数是文件还是文件夹 如果是文件,则计算行数 之后,如果行数大于20或更少,他会做一些指示 问题在于这条指令PartialView

我的剧本:

n=  cat $a | wc -l

这是执行错误指令的输出

#!/usr/bin/env bash
echo 'Hello this is the test of' `date`
echo 'arguments number is ' $#
if [ $# -eq 4 ]
then
    for a in $@
    do
    if [ -d $a ]
    then
        ls $a > /tmp/contenu
        echo "contenu modified"
    elif [ -f $a ]
        then
#        this instruction must set a numeric value into n
            echo "my bad instruction"
            n=  cat $a | wc -l
            echo "number of lines  = " $n
#        using the numeric value in a test (n must be numeric and takes the number of lines in the current file)
            if [ $n -eq 0  ]
            then
                echo "empty file"
            elif [ $n -gt 20 ]
            then
                echo ` head -n 10 $a `
            else
                cat $a
            fi
    else
        echo "no file or directory found"
    fi
    done
else
echo "args number must be 4"
fi

1 个答案:

答案 0 :(得分:3)

n= cat $a | wc -l是违规行为。永远记住bash shell脚本非常区分大小写。 shell将您的命令解释为必须运行两个单独的命令

n=  cat $a | wc -l
#^^ ^^^^^^^^^^^^^^
#1         2

第一部分只是将一个空字符串存储到变量n,然后下一个部分打印存储在变量a中的文件的行数。请注意,shell不会为此抛出错误。因为它没有违反语法(只是语义错误)。但是,行计数永远不会分配给变量n

当您与LHS上的空变量进行比较时,会遇到条件if [ $n -eq 0 ]时出现错误。

您想运行命令并存储其输出,您需要命令替换($(..))。假设$a包含文件的名称,只需执行

n=$(wc -l < "$a")

请注意,我删除了无用的cat用法并将其用于wc。但是wc可以直接从输入流中读取。

另请注意,您的脚本中有多个不良做法。请记住执行以下操作

  1. 始终双重引用shell变量 - "$#""$@"[ -f "$a" ][ -d "$a" ]
  2. 不要使用``进行命令替换,因为它不容易嵌套,你也可能遇到与引用相关的问题。
  3. 如果您确定脚本是否在[[下运行,其中可以使用包含空格的变量而不在LHS上引用
  4. ,则可以使用条件表达式bash