2014-09-23 12 views
2

사용자에게 값 확인을 요청할 수있는 많은 구성 변수가 있습니다. 따라서 존재하는 실행 번호를 지정하는 변수가있을 수 있으며 스크립트의 현재 변수 값이 ok인지 묻는 스크립트를 원합니다. 사용자가 값이 잘못되었다고 응답하면 스크립트는 새 값을 요청하고이를 변수에 지정합니다.사용자와 기존 변수의 값을 확인하는 Bash 함수를 작성하는 방법

나는 이것을하기위한 함수에서 초기 시도를했지만 그 실행에는 약간의 어려움이있다; 그것은 노점. 문제 해결에 대한 도움과 내가 사용하고있는 접근법에 대한 비판을 소중히 여깁니다. 다음과 같이 코드는 다음과 같습니다

confirmVariableValue(){ 
    variableName="${1}" 
    variableValue="${!variableName}" 
    while [[ "${userInput}" != "n" && "${userInput}" != "y" ]]; do 
     echo "variable "${variableName}" value: "${variableValue}"" 
     echo "Is this correct? (y: continue/n: change it/other: exit)" 
     read userInput 
     # Make the user input lowercase. 
     userInput="$(echo "${userInput}" | sed 's/\(.*\)/\L\1/')" 
     # If the user input is "n", request a new value for the variable. If the 
     # user input is anything other than "y" or "n", exit. If the user input 
     # is "y", then the user confirmation loop ends. 
     if [[ "${userInput}" == "n" ]]; then 
      echo "enter variable "${variableName}" value:" 
      read variableValue 
     elif [[ "${userInput}" != "y" && "${userInput}" != "n" ]]; then 
      echo "terminating" 
      exit 0 
     fi 
    done 
    echo "${variableValue}" 
} 

myVariable="run_2014-09-23T1909" 
echo "--------------------------------------------------------------------------------" 
echo "initial variable value: "${myVariable}"" 
myVariable="$(confirmVariableValue "myVariable")" 
echo "final variable value: "${myVariable}"" 
echo "--------------------------------------------------------------------------------" 
+0

이 질문은 코드 검토에 관한 내용이므로 주제가 아닌 것으로 보입니다. – chepner

+0

아니요 코드가 작동하지 않습니다.나는 이유를 모르며 도움을 요청하고 있습니다. – d3pd

+0

@chepner : 부분 만 코드 리뷰입니다. 오류 보고서가 있습니다. "멈 춥니 다." – bishop

답변

4

문제는 여기에 있습니다 :

myVariable="$(confirmVariableValue "myVariable")" 

질문,

echo "Is this correct? (y: continue/n: change it/other: exit)" 

가 화면에 myVariable에 가서하지 않는 것처럼.

인쇄 문제는 STDERR이나 STDOUT 이외의 다른 파일 설명자로 보내주십시오.

의견 기반의 댓글 : 나는 그런 설정 스크립트에 만족하지 않을 것이다. 그것은 너무 수다스러운입니다. 내가 더 나은 경우 : 설명 및 기본값 밖으로

  • 인쇄는
  • Press Enter for confirm or enter a new value or <something> for exit>

당신은 또한 다음과 같은 기술을 사용할 수 있습니다 문의 :

  • 이 떠들썩한 파티를 사용 readline 라이브러리 read에 대한 명령과 함께 -e
  • 사용 대한 -i value ... 편집
  • 에 대한 기본 값이 변수에 인쇄 할 printf -v variable를 사용, 그래서 당신은 var=$(...)도 어떤 (잠재적으로) 위험 평가를 사용할 필요가 없습니다 설정

예 :

err() { echo "[email protected]" >&2; return 1; } 

getval() { 
    while : 
    do 
     read -e -i "${!1}" -p "$1>" inp 
     case "$inp" in 
      Q|q) err "Quitting...." || return 1 ;; 
      "") err "Must enter some value" ;; 
      *) 
       #validate the input here 

       #and print the new value into the variable 
       printf -v "$1" "%s" "$inp" 
       return 0 
       ;; 
     esac 
    done 
} 

somevariable=val1 
anotherone=val2 
x=val3 

for var in somevariable anotherone x 
do 
    getval "$var" || exit 
    echo "new value for $var is: =${!var}=" 
done 
+0

오, 나는'printf -v'에 대해 몰랐다. 멋지다! – bishop

+0

아, 아주 근사합니다. 문제에 대한 명확한 설명과 코드에서보다 사용자 친화적이지만 더 효율적인 솔루션에 감사드립니다. – d3pd

+0

@ d3pd 도움이되었습니다. ;) – jm666

1

"예"라고 대답하지 않았 으면 새 값을 입력하십시오. 원하는 경우 새 값을 입력하게하거나 기본값을 그대로 사용하려면 비워 둡니다. 빈은 기본이 될 수 있다면, 당신은 계정에 필요, 물론

$ foo='foo_default_value' 
$ bar='default_for_bar' 
$ confirm foo bar 
Confirming values for several variables. 

foo = foo_default_value ... leave blank to accept or enter a new value: bar 
bar = default_for_bar ... leave blank to accept or enter a new value: 

foo=[bar], bar=[default_for_bar] 

:

function confirm() { 
    echo "Confirming values for several variables." 

    for var; do 
     read -p "$var = ${!var} ... leave blank to accept or enter a new value: " 
     case $REPLY in 
     "") # empty use default 
      ;; 
     *) # not empty, set the variable using printf -v 
      printf -v "$var" "$REPLY" 
      ;; 
     esac 
    done 
} 

과 같이 사용합니다 :

이 작은 기능을 사용하면 하나의 호출에 여러 변수를 설정할 수 있습니다 이를 위해 @ jm666처럼 read -i을 사용하십시오.

+0

사용자가 입력을 입력 할 때'eval'을 사용하면 약간 위험 할 수 있습니다 ... (인간 요인, 실수 ...) – jm666

+0

@ jm666 : 네. 이제'printf -v'에 대해서 알았습니다. (팁 주셔서 감사합니다!)'eval'을 마지막으로 합리적인 방법으로 사용하지 않았습니다. – bishop

+0

:)'declare' (typeset)도 확인하십시오. 또한 변수를 설정할 수 있습니다. 기꺼이 도와 드리겠습니다. – jm666