Bash打印不正确的文件行数

时间:2014-10-12 14:53:46

标签: bash loops printing counter

初学者寻求帮助(:

所以,我有一个脚本检查文本文件中的括号,并告诉它们是否正确关闭。但是,我还想让我的脚本打印出错误行的编号(括号被错误关闭)。我已经尝试计算文件行,然后进行嵌套的while循环,但是,它根本不适用于我:是否有任何简单的解决方案?如果可能的话,我想离开LINE计数器:

INPUT="$1" 
count=0
LINE=0


# Check if file exists
[ ! -f $INPUT ] && { echo "file $INPUT do not exist."; exit ; }


# Count file lines and read every char
while IFS= read -r LINE
do
LINE=$(( LINE + 1 ))
     while read -n1 char
     do
     [ "$char" == "(" ] && (( count++ ))
     [ "$char" == ")" ] && (( count-- ))

     if [ "$count" -lt 0 ]
     then
          break 
     fi

done 
done < "$INPUT"


if [ "$count" -lt 0 ]
   then
echo "Found a mistake in $LINE line "
   else
echo "Everything's correct"
fi

1 个答案:

答案 0 :(得分:1)

你有几个问题:

  • 内部循环中的read会消耗文件中的输入,而不是来自LINE
  • 该行

    LINE=$(( LINE + 1 ))
    

    确实是错误的:LINE是您文件行的内容,并且您尝试向其添加1。怪异。

  • 你的break只打破内循环(它应该打破两个循环)。请使用break 2

以下是您的脚本的工作版本:

input=$1
count=0
linenb=0

# Check if file exists
[[ -f $input ]] || { echo "Error: file $input do not exist."; exit 1; }

# Count file lines and read every char
while IFS= read -r line; do
    ((++linenb))
     while read -n1 char; do
         [[ $char == '(' ]] && ((++count))
         [[ $char == ')' ]] && ((--count))
         ((count>=0)) || break 2
     done <<< "$line"
done < "$input"

if ((count<0)); then
    echo "Found a mistake in line #$linenb:"
    printf '%s\n' "$line"
else
    echo "Everything's correct"
fi

请注意,我使用了更多((...))[[...]]

我还使用了小写变量名,因为你的计算机没有聋:你不需要喊出变量的名称。 (它的眼睛更好)。使用小写变量名是一个好习惯,因为它们不可能与Bash自己的变量发生冲突。