2016-04-15 138 views
0

我正在构建一个脚本来计算给定字符串中两个字母的出现次数。我无法弄清楚如何使变量成为一个可测试的数字。Bash语法错误:算术运算期望的操作数

#!/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: line 12: [[: /trfindr: syntax error: operand expected (error token is "/trfindr")

/automount/home/jcampbell/tools/itc/trfind.sh: line 16: [[: /trfindr: syntax error: operand expected (error token is "/trfindr")

/automount/home/jcampbell/tools/itc/trfind.sh: line 20: [[: /trfindr: syntax error: operand expected (error token is "/trfindr")

/automount/home/jcampbell/tools/itc/trfind.sh: line 24: [[: /trfindr: syntax error: operand expected (error token is "/trfindr")

/automount/home/jcampbell/tools/itc/trfind.sh: line 28: [[: /trfindr: syntax error: operand expected (error token is "/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

直接的问题是,您将文件名,而不是其内容,分配给您获取错误的变量。 – tripleee

+0

如果它不熟悉,你可以得到像'rcount = $(grep -oi'r'<<<“$ 1”| wc -l)' – tripleee

回答

0

你需要使用像

var=$(grep -c r ~/trfindlog.txt) 

注意grep将计算匹配的行数,而不是匹配的数量。所以,你真正需要的是更多的东西,如:

var=$(echo $1 | tr -cd r) 
echo ${#var} 
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如上,然后生成更小的部分在剩余的情况下,一个字符串。

+0

这样的变量的结果我用大写字母而不是低字节并且太懒惰改变它。 – tripleee