2010-02-17 45 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