변수 값을 변경하는 Bash 스크립트 기능

변수 값을 변경하는 Bash 스크립트 기능

매개변수 중 하나(예: 변수)의 값을 변경하는 BASH 스크립트용 함수를 만들고 싶습니다. 제가 만든 기능은 다음과 같습니다.

chck_rgx () { # Checks that the given name for a user/group fulfills the regex. The function's parameters are                                                                                                         
              #   * $1: kind of name to check: username, hostname, etc.
              #   * $2: variable whose value to check if meets the requirements.                         
  local rgx_hostname='^[a-z][a-zA-Z0-9_-]+$' ;                                                                                          
  local rgx_inputbox_hostname="The hostname you just submitted isn't a valid name. Try with another name."
  local rgx_username='^[a-z][a-z0-9_-]+$' ;
  local rgx_inputbox_username="The username you just submitted isn't a valid name. Try with another name." ;
  eval rgx_name="\$rgx_$1" ;                                                                                                            
  eval rgx_inputbox="\$rgx_inputbox_$1" ;                                                                                               
  eval name_ch="\$$2" ;                                                                                                                 
  while [[ ! $name_ch =~ $rgx_name ]] ; do                                                                                              
    dialog --backtitle "$backtitle_var" \       
           --title     "Wrong $1 submitted" --clear \                                                           
           --inputbox  "$rgx_inputbox" 0 0 2> name-ch ;                                                                              
    name_ch=$(cat name-ch) ;                                                                                                            
    rm name-ch ;                                                                                                                        
  done                                                                                                                                  
  chckd_var="$name_ch" ;
}

그런 다음 스크립트의 일부 부분에 이름을 입력하라는 대화 상자가 표시되고 함수는 해당 이름이 유효한 이름인지 확인합니다. 예를 들어,

dialog  --backtitle "$backtitle_var" \                                                                                              
        --title     "Submit the username" --clear \                                                                  
        --inputbox  "Which username do you want?" 0 0 2> user-name ;                                             
user_name=$(cat user-name) ;                                                                                                          
chck_rgx username user_name ;                                                                                                 
user_name=$chckd_var ;                 

내가 겪고 있는 문제는 내 함수의 "출력", 즉 내가 지금 가지고 있는 값이 원래 사용했던 것과 동일한 변수에 없다는 것입니다. 함수 매개변수로 삽입한 변수(user_name)에 함수($chckd_var)의 "출력" 값을 할당해야 합니다. 내가 원하는 것은 함수가 전역 변수 user_name(또는 다른 변수)의 값을 변경하는 것입니다.

또한 대화 상자의 입력 상자 출력을 파일이 아닌 변수로 직접 가져올 수 있는 방법이 있는지 궁금합니다.

저는 BASH 스크립팅을 처음 접했기 때문에 대답은 간단할 수 있습니다. 어쨌든 이 문제에 대해 온라인에서 찾아봤지만 답을 찾지 못했습니다.

답변1

글쎄요, 첫 번째 질문에 대한 답은 Stack Exchange에서 질문 제목을 쓸 때 했던 제안을 통해 찾은 것 같습니다. 이것을 변경하면 다음과 같이 알 수 있을 것 같습니다.

chck_rgx () { # Checks that the given name for a user/group fulfills the regex. The function's parameters are                                                                                                         
              #   * $1: kind of name to check: username, hostname, etc.
              #   * $2: variable whose value to check if meets the requirements.                         
  local rgx_hostname='^[a-z][a-zA-Z0-9_-]+$' ;                                                                                          
  local rgx_inputbox_hostname="The hostname you just submitted isn't a valid name. Try with another name."
  local rgx_username='^[a-z][a-z0-9_-]+$' ;
  local rgx_inputbox_username="The username you just submitted isn't a valid name. Try with another name." ;
  eval rgx_name="\$rgx_$1" ;                                                                                                            
  eval rgx_inputbox="\$rgx_inputbox_$1" ;                                                                                               
  eval name_ch="\$$2" ;                                                                                                                 
  while [[ ! $name_ch =~ $rgx_name ]] ; do                                                                                              
    dialog --backtitle "$backtitle_var" \       
           --title     "Wrong $1 submitted" --clear \                                                           
           --inputbox  "$rgx_inputbox" 0 0 2> name-ch ;                                                                              
    name_ch=$(cat name-ch) ;                                                                                                            
    rm name-ch ;                                                                                                                        
  done                                                                                                                                  
  declare -g -- "$2=$name_ch" ;
}

변화는

declare -g -- "$2=$name_ch"

어쨌든, 대화 상자의 입력 상자의 출력을 파일이 아닌 변수로 직접 얻을 수 있는 방법이 있는지 알고 싶습니다.

감사해요.

답변2

다음 리디렉션을 사용할 수 있습니다.

text=$(dialog --backtitle 'foo' --title 'bar' --clear --inputbox 'baz' 0 0 2>&1 >/dev/tty)
case $? in
    0)     echo "Approved with: $text" ;;
    1)     echo "Canceled by the cancel button" ;;
    255|*) echo "Canceled by the escape key" ;;
esac

관련 정보