【问题标题】:Getting the line count of a file in a shell script with wc failing在 wc 失败的情况下获取 shell 脚本中文件的行数
【发布时间】:2017-12-28 09:12:23
【问题描述】:

我的脚本检查参数是文件还是文件夹 如果是文件,他会计算行数 之后,如果行数很大,那么 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】:

    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. 如果您确定脚本是否在bash 下运行,您可以使用条件表达式[[,其中可以使用包含空格的变量而无需在LHS 上引用

    【讨论】:

      猜你喜欢
      • 2011-10-13
      • 2015-11-14
      • 2011-04-28
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多