2011-01-14 13 views
0

私はbashスクリプトで動的case文を作成する方法を理解しようとしています。bashの動的case文

たとえば、のは、私はこのシナリオでは、次の内容

red 
green 
blue 

とawkの文の出力を持っているとしましょう、出力はいつでも変更することができます。

このawk出力に値が含まれていると、別のロジックを実行しようとしています。 (http://www.debian-administration.org/article/An_introduction_to_bash_completion_part_2を参照してください、私はダイナミックカスタムタブ補完機能を構築するためにこれを使用しようとしている

case "${my_var}" in 
    $list) 
     ..... 
    something_else) 
     ..... 
esac 

:上記データは$リストにある場合

だから、私は概念的ような何かをしたいと思います背景のために)。

アイデア?

ありがとうございました。

+2

興味深いのは、「それぞれの行動についてケースのどの部分に入るのか、どのように指定するのですか? –

答えて

3

caseステートメントは、おそらくジョブの適切なツールではありません。 awkの出力を配列に格納すると、配列内をループして選択肢があるかどうかを調べることができます。また、どのインデックスがあるかを知ることもできます。

#!/bin/bash 

# Store command output in an array so each word is a separate array item.  
list=($(echo $'red\ngreen\nblue')) 
my_var=blue 

for ((i = 0; i < ${#list}; i++)); do 
    if [[ ${list[$i]} = $my_var ]]; then 
     echo "found at index $i" 
     break 
    fi 
done 

if ((i == ${#list})); then 
    echo "not found" 
fi 
2

case文ではこれを行うことはできませんが、自分のヘルパーを設定してリストのメンバーシップを確認するだけで十分です。

# stub to simulate this arbitrary call 
my_awk_command() { printf '%s\n' red green blue; } 
# helper to check list membership 
list_contains() { 
    local tgt="$1"; shift 
    while (($#)); do 
    if [[ $1 = "$tgt" ]] ; then 
     return 0 
    fi 
    shift 
    done 
    return 1 
} 

# the below is Bash 4 functionality; see BashFAQ #1 on how to replace it 
readarray -t awk_output < <(my_awk_command) 

if list_contains "$my_var" "${my_awk_command[@]}"; then 
    ...something... 
elif [[ "$my_var" = something_else ]] ; then 
    ...something else... 
fi 
1

さまざまハックいくつかの方法でこれをアプローチすることができます

1)リストを確保するには次のとおりです。次のようにして

pattern=($(awk_command))  # red\ngreen\nblue\n 
saveIFS=$IFS 
IFS='|' 
pattern="^(${pattern[*]})$" # ^(red|green|blue)$ (perhaps hackish) 
IFS=$saveIFS 

# simple regex match if statement (not hackish) 
if [[ $var =~ $pattern ]] 
then 
    do_something 
fi 

# or a backwards case statement (very hackish) 
case 1 in # this could be a variable or a command substitution 
    $([[ $var =~ $pattern]] && echo 1)) # the echo 1 could be another command or the 1 could be yet another variable 
     do_something;; 
    *) 
     do_default;; 
esac 
2

あなたはbashで、動的case文を作成することができますパイプ(|)は分離しています。 IE。赤|緑|

2青)は例えばevalの

であなたのcase文をラップ:これは単純な変数処理のために働く

valid="red|green|blue" 

eval "case \"$choice\" in 
    $valid) 
     echo do something good here 
     ;; 
    *) 
     echo invalid colour 
     ;; 
esac" 

、私は、これはすべてのケースでは動作を保証することはできません。