我正在构建一个脚本来计算给定字符串中两个字母的出现次数。我无法弄清楚如何使变量成为可测试的数字。
#!/bin/bash
touch ~/trfindlog.txt ~/trfindt ~/trfindr
echo $1 > ~/trfindlog.txt
cat ~/trfindlog.txt | grep -oi r | wc -l > ~/trfindr
cat ~/trfindlog.txt | grep -oi t | wc -l > ~/trfindt
varR='/trfindr'
varT='/trfindt'
if [[ "${varR}" -eq 0 && "${varT}" -eq 0 ]]
then
echo "This phrase contains no Rs or Ts."
elif [[ "${varR}" -eq 1 && "${varT}" -eq 1 ]]
then
echo "This phrase contains 1 R and 1 T."
elif [[ "${varR}" -gt 1 && "${varT}" -eq 1 ]]
then
echo "This phrase contains ${varR} Rs and 1 T."
elif [[ "${varR}" -eq 1 && "${varT}" -gt 1 ]]
then
echo "This phrase contains 1 R and ${varT} Ts."
elif [[ "${varR}" -gt 1 && "${varT}" -gt 1 ]]
then
echo "This phrase contains ${varR} Rs and ${varT} Ts."
fi
rm ~/trfindlog.txt ~/trfindt ~/trfindr
exit
此脚本给出了以下错误。
/automount/home/jcampbell/tools/itc/trfind.sh:第12行:[[:/ trfindr:语法错误:操作数预期(错误标记为“/ trfindr”)
/automount/home/jcampbell/tools/itc/trfind.sh:16行:[[:/ trfindr:语法错误:操作数预期(错误标记为“/ trfindr”)
/automount/home/jcampbell/tools/itc/trfind.sh:20行:[[:/ trfindr:语法错误:操作数预期(错误标记为“/ trfindr”)
/automount/home/jcampbell/tools/itc/trfind.sh:24行:[[:/ trfindr:语法错误:操作数预期(错误标记为“/ trfindr”)
/automount/home/jcampbell/tools/itc/trfind.sh:line 28:[[:/ trfindr:语法错误:操作数预期(错误标记为“/ trfindr”)
这是工作脚本。这只适用于踢腿和踢球教育自己。我很高兴收到各种答案。
#!/bin/bash
touch ~/trfindlog.txt
echo $1 > ~/trfindlog.txt
varR=$(echo $1 | tr -cd r)
varT=$(echo $1 | tr -cd t)
if [[ "${#varR}" -eq 0 && "${#varT}" -eq 0 ]]
then
echo "This phrase contains no Rs or Ts."
elif [[ "${#varR}" -eq 1 && "${#varT}" -eq 1 ]]
then
echo "This phrase contains 1 R and 1 T."
elif [[ "${#varR}" -gt 1 && "${#varT}" -eq 1 ]]
then
echo "This phrase contains ${#varR} Rs and 1 T."
elif [[ "${#varR}" -eq 1 && "${#varT}" -gt 1 ]]
then
echo "This phrase contains 1 R and ${#varT} Ts."
elif [[ "${#varR}" -gt 1 && "${#varT}" -gt 1 ]]
then
echo "This phrase contains ${#varR} Rs and ${#varT} Ts."
fi
rm ~/trfindlog.txt
exit
答案 0 :(得分:3)
将变量放在文件中是麻烦的,不优雅的,并且如果您同时运行脚本的两个实例,则使用静态文件名将会中断。所有这些对于内存中的变量都会更加简洁。
使用Bash,您可以复制变量并执行简单替换。
Rs=${1//[!R]/}
Ts=${1//[!T]/}
现在,每个字符串的长度都是您要查找的字符的出现次数。
echo "We have ${#Rs} R characters and ${#Ts} T characters."
决定是否打印复数s
应该是一个简单的补充。提示:如果第一个字符串正好是R
,您想要取消s
。但是如果你想要灵活的措辞,那么使用case
语句就可能更简单。
case $Rs:$Ts in
:) echo "We have none of either";;
R:) echo "We have one R and no Ts.";;
:T) echo "We have no Rs and one T.";;
R:T) echo "We have one of each.";;
*:) echo "We have ${#Rs} Rs and no Ts.";;
*:T) echo "We have ${#Rs} Rs and one T.";;
:*) echo "We have no Rs and ${#Ts} Ts.";;
R:*) echo "We have one R and ${#Ts} Ts.";;
*:*) echo "We have ${#Rs} and ${#Ts} Ts.";;
esac
如上所述,我仍然很想处理角落最多的情况:
和R:T
,然后在其余情况下从较小的部分生成一个字符串。
答案 1 :(得分:0)
您需要使用类似
的内容var=$(grep -c r ~/trfindlog.txt)
请注意grep
将计算匹配行数,而不是匹配数。所以,你真正需要的更像是:
var=$(echo $1 | tr -cd r)
echo ${#var}