Bash 统计文件中特殊字符的出现次数

Bash 统计文件中特殊字符的出现次数,bash,count,ascii,Bash,Count,Ascii,我正在编写一个bash脚本,该脚本将计算[]、()、{}、“、`”和//的出现次数,以便调试其他脚本是否缺少其中一个。 代码如下: a=0; b=0; cc=0; d=0; e=0; f=0; g=0; h=0; i=0; j=0 # set default values squote=`echo -e "\x27"` dquote=`echo -e "\x22"` while IFS= read -r -n1 c; do [ "$c" == "[" ] && (( a

我正在编写一个bash脚本,该脚本将计算[]、()、{}、“、`”和//的出现次数,以便调试其他脚本是否缺少其中一个。 代码如下:

a=0; b=0; cc=0; d=0; e=0; f=0; g=0; h=0; i=0; j=0   # set default values
squote=`echo -e "\x27"`
dquote=`echo -e "\x22"`

while IFS= read -r -n1 c; do
  [ "$c" == "[" ] && (( a++ ))
  [ "$c" == "]" ] && (( b++ ))
  [ "$c" == "(" ] && (( cc++ ))     # i imported this line from another online script, is there a reason why the author avoids (( c++ )) ?
  [ "$c" == ")" ] && (( d++ ))
  [ "$c" == "{" ] && (( e++ ))
  [ "$c" == "}" ] && (( f++ ))
  [ "$c" == "\x27" ] && (( g++ ))    # single quote
  [ "$c" == "$dquote" ] && (( h++ ))  # double quote
  [ "$c" == '`' ] && (( i++ ))        # back tick
  [ "$c" == '/' ] && (( j++ ))        # forward slash
done < "$1"

echo '[]'="$a,$b"
echo '()'="$cc,$d"
echo '{}'="$e,$f"
echo "$squote" ="$g"
echo "$dquote" ="$h"
echo '``'="$i"
echo '/'="$j"      # when used this way: /hello/ 
a=0;b=0;cc=0;d=0;e=0;f=0;g=0;h=0;i=0;j=0#设置默认值
squote=`echo-e“\x27”`
dquote=`echo-e“\x22”`
而IFS=read-r-n1 c;做
[“$c”==”[“]&&((a++)
[“$c”==“]”]&&((b++)
[$c] = =“()”&((cc++))我从另一个在线脚本导入了这行,有没有作者避免((C++))的原因?
[“$c”=”]&((d++)
[“$c”==”{“]&&((e++)
[“$c”==“}”]&&((f++)
[“$c”==“\x27”]&&((g++)单引号
[“$c”==“$dquote”]&&((h++)#双引号
[“$c”=''`]&&((i++)#回勾
[“$c”=='/']&&((j++)正斜杠
完成<“$1”
回音“[]”=“$a,$b”
echo“()”=“$cc,$d”
回音“{}”=“$e,$f”
回声“$squote”=“$g”
回显“$dquote”=“$h”
回音“``=“$i”
echo“/”=“$j”#当以这种方式使用时:/hello/
问题: 1)为什么C++代替C++ 2) 为什么有些结果根本不正确。 3) 如何正确注释特殊字符。
提前感谢您的帮助。

一些简化和功能脚本

#!/bin/bash

a=0; b=0; c=0; d=0; e=0; f=0; g=0; h=0; i=0; j=0

while read -r -n1 char; do
    case "$char" in
        "[" ) (( a++ )) ;;
        "]" ) (( b++ )) ;;
        "(" ) (( c++ )) ;;
        ")" ) (( d++ )) ;;
        "{" ) (( e++ )) ;;
        "}" ) (( f++ )) ;;
        "'" ) (( g++ )) ;;
        '"' ) (( h++ )) ;;
        '`' ) (( i++ )) ;;
        '/' ) (( j++ )) ;;
    esac
done <<< "[]{}()/"$'\x60'$'\x22'$'\x27'     # $'\x60' == backtick

echo '[]'="$a,$b"
echo '()'="$c,$d"
echo '{}'="$e,$f"
echo "'" ="$g"
echo '"' ="$h"
echo '`'="$i"
echo '/'="$j"
注:

要检查脚本并学习,我建议安装shellcheck或使用

最初:

    [ "$char" == "[" ] && (( a++ ))
    [ "$char" == "]" ] && (( b++ ))
    [ "$char" == "(" ] && (( c++ ))
    [ "$char" == ")" ] && (( d++ ))
    [ "$char" == "{" ] && (( e++ ))
    [ "$char" == "}" ] && (( f++ ))
    [ "$char" == "'" ] && (( g++ ))
    [ "$char" == '"' ] && (( h++ ))
    [ "$char" == '`' ] && (( i++ ))
    [ "$char" == '/' ] && (( j++ ))
但不必要的测试是系统地进行的。 我们还可以使用:

    if [[ $char == "[" ]]; then (( a++ ))
    elif [[ $char == "]" ]]; then (( b++ ))
    ...
但10000次迭代的性能:

   if   > if elif > case  
6720 ms > 2895 ms > 2073 ms

那么,您已经在使用
c
作为从文件中读取的字符;您不能对
计数器)使用相同的名称。我想是时候休息一下了。D)您是对的,上面没有显示。我只是在脚本后面使用g=$(tr-cd'\x27'<$1|wc-c)来验证上述结果;这些
test
命令中只有一个是真的<“[”((a++);;“]”((b++);;”中的代码>大小写$char。。。esac@kyodev:我写这个脚本是因为在一个更长的脚本中,我得到了“语法错误:意外的文件结尾”错误,其中一个缺少结尾)]“通常是失败的原因。感谢更改:$char而不是$c;所以使用[[if比较和验证一次完成吗?还有,[“$char”==“[”]&&((a++)或chepner建议的case/esac构造对于长文本/脚本更快?对不起,我使用[[只是为了避免在变量周围加引号,只是因为cosméticyes,case比所有if测试快3倍,所以对于长文本/脚本可见
    if [[ $char == "[" ]]; then (( a++ ))
    elif [[ $char == "]" ]]; then (( b++ ))
    ...
   if   > if elif > case  
6720 ms > 2895 ms > 2073 ms