2017-04-14 1 views
-1

쉘 스크립팅을 처음 사용합니다. 나는 파일에서 몇 개의 문자열 값을 대체 할 requriment. 명령 행에서 읽어야하고 쉘 스크립트는 아래처럼 보입니다.배열에 같은 이름의 인수를 사용하는 방법

test.sh --old-value yahoo.com --new-value ibibo.io --old-value xxxxxx --new-value yyy --exclude aa bb cc 

는 지금, 나는 다른 배열에 하나 개의 배열, --new-값으로 --old-값을 읽고 다른 배열로 --exclude합니다.

나는 아래의 접근 방법을 시도하고있다.

while [[ $# -gt 1 ]] 
    do 
    key="$1" 

    case $key in 



     --old-value) 
     OLDVALUE="$2" 
     shift # past argument 
     ;; 

     --new-value) 
     NEWVALUE="$2" 
     shift # past argument 
     ;; 

     --exclude) 
     EXCLUDEFILETYPES=("[email protected]") 
     shift 
     ;; 

     *) 
     # unknown option 
    ;; 
esac 
shift # past argument or value 
done 

그러나 이전 값을 OLDVALUE로 읽습니다. --old-values를 배열로 읽어야합니다.

누군가이 유스 케이스 달성 방법에 대해 도움을 줄 수 있습니까?

+0

두 가지 옵션을 사용하면 약간 자세한 정보가 표시됩니다. 특히 쌍으로 표시해야하기 때문에 * 특히 * 사용해야합니다. 당신은 두 개의 인수를 취하는 단일 옵션으로 그것을 줄일 수있는 기회는 무엇입니까? 예 :'test.sh --replace yahoo.com ibibo.io --replace xxxxx yyy --exclude aa bb cc' – chepner

답변

1
#!/bin/bash 

# declare arrays 
old=(); new=(); exclude=() 

while [[ $# -gt 1 ]]; do 
    key="$1" 
    value="$2" 
    [[ $key == --old-value ]] && old+=("$value") 
    [[ $key == --new-value ]] && new+=("$value") 
    [[ $key == --exclude ]] && shift && exclude+=("[email protected]") 
    shift 2 
done 

# show content of arrays 
declare -p old new exclude 

마지막 인수는 --exclude aa bb cc입니다.


예 : ./test.sh --old-value yahoo.com --new-value ibibo.io --old-value xxxxxx --new-value yyy --exclude aa bb cc

출력 :

 
declare -a old='([0]="yahoo.com" [1]="xxxxxx")' 
declare -a new='([0]="ibibo.io" [1]="yyy")' 
declare -a exclude='([0]="aa" [1]="bb" [2]="cc")' 
+0

너보다. 그것은 나를 위해 일했다. – Phani

0

다른 변형 :

while (($#)); do 
    case "$1" in 
    --old-value) old+=("$2") ;; 
    --new-value) new+=("$2") ;; 
    --exclude) shift; exc=("[email protected]") ; break ;; 
    --*) echo "bad arg" ; exit 1 ;; 
    esac 
    shift;shift 
done 
printf "old: %s\n" "${old[@]}" 
printf "new: %s\n" "${new[@]}" 
printf "exc: %s\n" "${exc[@]}" 

출력

old: yahoo.com 
old: xxxxxx 
new: ibibo.io 
new: yyy 
exc: aa 
exc: bb 
exc: cc 
01,

물론 이것은 여전히 ​​문제가 있습니다. 예를 들어 스크립트가 다음과 같이 호출 된 경우

--old-value yahoo.com --new-value --old-value xxxxxx --new-value yyy --exclude aa bb cc 

새 값 인수가 누락되었습니다. 이 경우 결과는 물론 틀린 것입니다 ...

old: yahoo.com 
new: --old-value 
exc: 

이러한 오류 사례를 처리하는 것은 훨씬 더 복잡한 상태 처리가 필요합니다.

관련 문제