2011-01-14 3 views
0

bash 스크립트에서 동적 case 문을 작성하는 방법을 알아 내려고하고 있습니다.bash의 동적 case 문

예를 들어, 내가이 시나리오에서는 다음과 같은 내용

red 
green 
blue 

과 AWK 문의 출력을 가지고 있다고하자, 출력은 언제든지 변경할 수 있습니다.

이 awk 출력에 값이 포함되어 있으면 다른 논리를 실행하려고합니다.

위의 $ 목록에있는 데이터는, 그때는 개념적으로 같은 것을 할 싶습니다 그래서 만약 :

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

내가 동적 사용자 정의 탭 완성 기능을 구축하기 위해 이것을 사용하려고 해요를 (참조 http://www.debian-administration.org/article/An_introduction_to_bash_completion_part_2 일부 배경).

아이디어가 있으십니까?

감사합니다.

+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 파란색) 예를 들어 평가 후면

에 case 문을 포장 : 이것은 단순 변수 처리를 위해 작동

valid="red|green|blue" 

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

, 나는이 모든 경우에 작동합니다 보장 할 수 없습니다.