2016-04-15 135 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