2015-01-23 5 views
1

여기에 내 현재 프로세스의 :설정 기본값

var[product]=messaging_app 
var[component]=sms 
var[version]=1.0.7 
var[yum_location]=$product/$component/$deliverable_name 
var[deliverable_name]=$product-$component-$version 

# iterate on associative array indices 
for default_var in "${!var[@]}" ; do 

    # skip variables that have been previously declared 
    if [[ -z ${!default_var} ]] ; then 

    # export each index as a variable, setting value to the value for that index in the array 
    export "$default_var=${var[$default_var]}" 
    fi 
done 

내가 찾고 핵심 기능은 이전에 선언 덮어 쓰지 않습니다 기본 변수의 목록을 설정하는 것입니다 변수.

위의 코드는 그렇게하지만이 변수의 문제가 이제는 서로 의존 할 수 없게 만들었습니다. "${!var[@]}"에서 연관 배열의 인덱스 출력의 순서는 항상 그들이 선언 된 순서와 동일하지 않기 때문입니다

같이 존재 간단한 해결책 않습니다.

declare --nooverwrite this=that 

내가 할 수 없었다을 그와 비슷한 것을 찾아야합니다.

또한 if 문을 사용하여이 작업을 수행 할 수 있음을 알고 있습니다. 그러나 많은 if 문을 사용하면 거의 100 개의 기본 변수가있는 스크립트의 가독성이 떨어집니다. 3.5.3 Shell Parameter Expansion에서

답변

1

:

$ {매개 변수 : = 단어} 매개 변수가 설정 또는 null의

경우는, 단어의 확장은 매개 변수에 할당됩니다. 그런 다음 매개 변수의 값이 대체됩니다. 이런 식으로 위치 매개 변수와 특수 매개 변수를 할당 할 수 없습니다.

그래서 그렇지 않으면 쉘에 확장 어떤 명령으로 실행하기위한 요청으로 ${this:=that}를 볼 것이기 때문에 필요

: ${this:=that} 

:.

$ echo "$this" 
$ : ${this:=that} 
$ echo "$this" 
that 
$ this=foo 
$ echo "$this" 
foo 
$ : ${this:=that} 
$ echo "$this" 
foo 

할 수 있습니다 또한이 일이 더 적합한 경우이 (대신 자체의) 당신이 변수를 사용하는 첫 번째 장소 (하지만 그 최대 나중에 편집의 혼란에 쉽게 때문에 그것이 분명 확인)합니다.

$ echo "$this" 
$ echo "${this:=that}" 
that 
$ echo "$this" 
that 

동적으로 수행하는 것이 덜 쉽고 eval이 필요할 수 있습니다.