Bash 统计文件中特殊字符的出现次数
我正在编写一个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
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