Bash语法错误:算术运算需要的操作数

时间:2016-04-15 08:48:48

标签: regex bash shell

我正在构建一个脚本来计算给定字符串中两个字母的出现次数。我无法弄清楚如何使变量成为可测试的数字。

#!/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

2 个答案:

答案 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}