Função de script Bash que altera o valor de uma variável

4

Eu gostaria de fazer uma função para um script BASH que altera o valor de um de seus argumentos, que é uma variável. A função que eu fiz é:

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" ;
}

Em seguida, em alguma parte do script, há uma caixa de diálogo solicitando que você insira um nome e, em seguida, essa função verifica se o nome fornecido é um nome válido. Por exemplo,

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 ;                 

O problema que tenho é que a "saída" da minha função, o valor que tenho agora, não está na mesma variável que usei em primeiro lugar. Eu tenho que atribuir o valor da "saída" da minha função ($ chckd_var) para a variável que eu inseri como um argumento na função (user_name). O que eu quero fazer é que a função mude o valor da variável global user_name (ou qualquer outra variável).

Além disso, gostaria de saber se existe uma maneira de obter a saída de uma caixa de diálogo de diálogo diretamente em uma variável; não em um arquivo.

Sou relativamente novo em scripts BASH, então talvez a resposta seja bem simples. De qualquer forma, eu tenho procurado por isso na web e não encontrei a resposta.

    
por ctafur 28.07.2015 / 23:48

2 respostas

0

Bem, acho que encontrei a resposta para minha primeira pergunta pelas sugestões que recebi ao escrever o título da minha pergunta no Stack Exchange. Eu acho que funciona com apenas uma mudança:

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" ;
}

A mudança está em

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

De qualquer forma, eu ainda quero saber se existe uma maneira de obter a saída de uma caixa de entrada de diálogo diretamente em uma variável; não em um arquivo.

Obrigado.

    
por 29.07.2015 / 00:07
0

Você pode usar os seguintes redirecionamentos:

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
    
por 29.07.2015 / 03:27