2013-12-13 15 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

相应地更新了答案。 –