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

问题描述 投票:1回答:1

我的脚本检查参数是文件还是文件夹(如果它是一个文件),他计算之后的行数,如果行数大于20或更少,他会做一些指令,问题在于这个指令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

这是执行错误指令的输出

my bad instruction
5
number of lines  = 
ExamenEx2.sh: line 19: [: -eq : opérateur unaire attendu
bash shell cat wc
1个回答
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. 不要使用``for command-substitution,因为它不容易嵌套,你也可能遇到与引用相关的问题。
  3. 如果您确定脚本是否在[[下运行,可以使用条件表达式bash,其中可以使用包含空格的变量而不在LHS上引用
© www.soinside.com 2019 - 2024. All rights reserved.