初学者寻求帮助(:
所以,我有一个脚本检查文本文件中的括号,并告诉它们是否正确关闭。但是,我还想让我的脚本打印出错误行的编号(括号被错误关闭)。我已经尝试计算文件行,然后进行嵌套的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
答案 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自己的变量发生冲突。