2013-12-13 13 views
1

這是工作代碼:如何修剪bash中的case'd操作數的數學運算?

nn=2 
((nn += ` 
    case "2" in 
    "1") printf 5 ;; 
    "2") printf 10 ;; 
    *) printf 20 ;; 
    esac 
`)) 
echo $nn 

我怎樣才能簡化這樣的:

nn=2 
((nn += ` 
    case "2" in 
    "1") 5 ;; 
    "2") 10 ;; 
    *) 20 ;; 
    esac 
`)) 
echo $nn 

我知道,在每種情況下的身體來完成。 (((nn + = 5))...((nn + = 10))... e.t.c.) 但建議保留第一個結構。

+0

如果你必須使用case,那麼你會非常譴責在模式之後使用命令,儘管可以將這些數字轉換爲命令,但這不是很好的維護或可讀性。你可以用內置的echo來代替'printf'。 –

+0

'回聲'的作品,但我想你也不想那樣。 – Hussain

回答

2

我不知道這是什麼做的有:

案「2」

...如果是這樣的優化是擺脫case的。但我想你的例子只是一個錯誤。

反正怎麼寫這樣的:

case "$1" in 
    1) m=5 ;; 
    2) m=10 ;; 
    *) m=20 ;; 
esac 
((nn += m)) 
echo $nn 

你寫你要「保持第一的結構」。我想你的意思是不要複製nn上的操作。通過這種方式重寫,nn上的操作在一個地方,case語句更改操作數,所以我認爲它應該可以滿足您的需要。這是一種更自然的編寫bash腳本的方式,而不是使用反向擴展。

+1

好的答案,+1,我沒有想到的方法,讓命令成爲變量賦值。大概就像我見過的那樣清潔使用'case'。 –

+1

@jcomeau_ictx感謝客氣的話,我很欣賞它;-) – janos

0

,如果你不介意不使用case,這就需要模式後命令,如果你的Bash版本支持關聯數組,你可以做[更新根據註釋]:

[email protected]:/tmp$ cat /tmp/test.sh; echo ---; bash /tmp/test.sh 
declare -A values=([abc]=0 [111]=5 [fff]=10); default=20 
function add() { 
number=$1; index=$2; 
echo $(($number + ${values[$index]:-$default})) 
} 
for test in 123 abc n 111 abz fff; do echo 2+values[$test]=$(add 2 $test); done 
--- 
2+values[123]=22 
2+values[abc]=2 
2+values[n]=22 
2+values[111]=7 
2+values[abz]=22 
2+values[fff]=12 

請注意,當我第一次進行這種修改時,出於某種原因,我的Bash版本顯示出奇怪的行爲,可能是由於我的數組不是這個數組。除了第一個測試,所使用的默認值是10,這是數組的最後一個賦值元素,它使用數組元素abc的值爲0的缺省值。值得注意的是,也許我會在某天:

[email protected]:/tmp$ cat /tmp/test.sh; echo ---; bash /tmp/test.sh 
function add() { 
number=$1; index=$2; values=([abc]=0 [111]=5 [fff]=10); default=20 
echo $(($number + ${values[$index]-$default})) 
} 
for test in 123 abc n 111 abz fff; do echo 2+values[$test]=$(add 2 $test); done 
--- 
2+values[123]=22 
2+values[abc]=12 
2+values[n]=12 
2+values[111]=7 
2+values[abz]=12 
2+values[fff]=12 

還要注意的是,在更新上面的例子讓我感動的靜態值子程序之外,因爲它可能更有意義,讓他們成爲全球性的腳本。

+0

謝謝!我沒有說我需要字符串模式。不是「1」,「2」。但是「abc」「111」「fff」。 – user1931823

+0

相應地更新了答案。 –