更改变量值的 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 ;                 

我遇到的问题是我的函数的“输出”,即我现在拥有的值,并不在我最初使用的同一个变量中。我必须将函数($chckd_var)的“输出”值分配给我作为函数参数插入的变量(user_name)。我想要做的是该函数更改全局变量 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

相关内容