2010-02-17 42 views
7

我抓住了函数式编程错误,所以自然没有什么是对我来说足够好了。 ;)庆典case语句评估为字符串

所以,在bash一个可以写:

case $status in 
    "foo") status="bar" ;; 
    "baz") status="buh" ;; 
    *) status=$status ;; 
esac 

但恐怕错别字,所以我最好喜欢写:

status=case $status in 
    "foo") "bar" ;; 
    "baz") "buh" ;; 
    *) $status ;; 
esac 

第二种形式是因为案件评估为上一次执行的命令的退出代码无效,这完全不符合我的要求。

是否有黑客很容易实现我上午找?

+0

你只是想编写一个函数? – thecoshman

+0

如果您担心输入错误,请在程序开始处使用['set -u'](https://sipb.mit.edu/doc/safe-shell/)。 – ceving

回答

9

如果你确定状态只会是一条线,你可以做这样的事情与SED:

status=$(echo "$status" | sed -e 's:^foo$:bar:' -e 's:^baz$:buh:') 

您可能还可以得到的东西在bash内置的替代工作。这几乎作品(我不知道有什么办法让精确匹配只):

status=${status/foo/bar} 
status=${status/baz/buh} 

如果你的目标只是要更加“实用”(而不是让你的代码更错字证明),你可以这样做:

status=$(
    case "$status" in 
    ("foo") echo "bar" ;; 
    ("baz") echo "buh" ;; 
    (*) echo "$status" ;; 
    esac) 

虽然说实话,是bash可能是最糟糕的语言之一,试图在功能它是真的设计了一个更为迫切的心态,通过这样的事实所示,你可以。不容易构成表情。请参阅第二段代码片段,我如何将它分解为两个单独的语句?如果bash中被设计为功能你能写出这样的事情,而不是:

status=${{status/baz/buh}/foo/bar} 

但这工作。

我只使用bash更简单的脚本,并为更复杂的东西使用像Python或Ruby建议。他们会让你编写更多的功能代码,而不必经常与语言搏斗。

+0

不回答问题并添加大量不相关信息的方法。 – mbac32768

+0

zsh会让你做像上一个例子那样的嵌套参数扩展。 –

+9

@ mbac32768据我所知,我确实回答了你的问题,事实上有三次。如果你不同意,也许你需要重新回答你的问题,或者你至少可以解释为什么这些解决方案不适合你。如果有人试图帮助你,努力工作会变得蹩脚。 –

-1

击4具有关联数组:

# setup 
unset vals i 
indices=(foo baz) 
val=(bar buh) 
declare -A vals    # associative 
for index in ${indices[@]} 
do 
    vals[$index]=${val[i++]} 
done 

$ # demos 
$ status="foo" 
$ status=${vals:-$status} 
$ echo $status 
bar 
$ status="not found" 
$ status=${vals:-$status} 
$ echo $status 
not found 
+0

这真的是你应该如何初始化bash4中的关联数组吗? –

+1

@Charles:这是适合这个演示的一种方法。例如,我可以完成'for foo baz'的索引,而不是使用数组。或者直接批量分配或从文件中读取。你问的是什么? –

2
status="baz" 
status=$(case $status in 
    "foo") echo "bar" ;; 
    "baz") echo "buh" ;; 
    *) echo $status ;; 
esac) 
echo "status: $status" 

输出

$ ./shell.sh 
status: buh 
+1

这是我发布的第三个片段,但有语法错误。 ($(...)'内部的关闭parens会混淆bash,因此您需要在每个case上使用可选的open paren。) –

+0

你是什么意思混淆bash? – ghostdog74

+0

好的,我猜你正在使用bash <4.0。在4.0中,我认为这是固定的。 – ghostdog74