Linux bash中的对话框未正确捕获变量

Linux bash中的对话框未正确捕获变量,linux,bash,dialog,sed,find,Linux,Bash,Dialog,Sed,Find,我对这个脚本的一致性有点问题。您可以运行一次,没有任何问题。但是,如果您立即将其加载并再次运行,它将无法正确获取变量,因为输出没有以正确的方式写入文件 例: 此实用程序设计用于更新4个文件。临时、.tiers、.version和.sync 在对话框提示的不同阶段,它会更新文件。我的问题是,有时它不会更新文件,我找不到任何原因,因为这只是在您已经运行了一次之后。我在启动时擦除文件,所以我不确定交易是什么。就好像它只是从记忆中抓取 无论如何,要测试这一点,您需要/test中的以下文件 谢谢任何能给我

我对这个脚本的一致性有点问题。您可以运行一次,没有任何问题。但是,如果您立即将其加载并再次运行,它将无法正确获取变量,因为输出没有以正确的方式写入文件

例: 此实用程序设计用于更新4个文件。临时、.tiers、.version和.sync 在对话框提示的不同阶段,它会更新文件。我的问题是,有时它不会更新文件,我找不到任何原因,因为这只是在您已经运行了一次之后。我在启动时擦除文件,所以我不确定交易是什么。就好像它只是从记忆中抓取

无论如何,要测试这一点,您需要/test中的以下文件

谢谢任何能给我一些指导的人

cat .tiers
Stable=1
Release=2
Beta=3
代码:


您可以使用该方法捕获对话框并将其直接放入变量:

exec 3>&1 
result=$(dialog  --menu head 15 20 6 $(for ((i=1;i<30;i++));do echo  tag$i item$i;done)  2>&1 1>&3);
exitcode=$?;
exec 3>&-;
echo $result $exitcode
此外,这里还有许多不干净的东西,如$(${VERSION}):

正如我从代码中了解到的,它将运行empty命令,因为在启动时版本为空,并且

 VERSION=`cat .version`
在tier_update_prompt()中 $VERSION仍然是空字符串

我曾试图重构您的代码,但结果却导致了如此多的建议:

  • 获取对话框结果,如上图所示
  • 使用参数运行函数:
#声明 函数_name(){ 参数=$1; 回显“$参数” } var=价值 #运行函数 函数名变量
  • 不要使用${VAR}过度复杂
  • 请记住,双引号会展开,因此
    echo“这里是$var”
    而不是
    echo“这里是$(echo${var})”

  • 尽可能少使用临时文件,例如:
    diff查看您之前提出的问题,从您认为最有帮助的每个问题帖子中选择一个答案,然后单击向上/向下箭头下的空复选标记以“接受”它。感谢您的投入-宁愿得到一些实际的帮助;)无需
    回送
    变量即可将其放入字符串中(在“sync_exists”函数中):其中的变量将展开<代码>“.sync存在于目录$VERSION…”
    Wow中,非常感谢。我是bash的不速之客,谢谢你的帮助。不过,我需要从对话框中获取输入,即:如果他们选择了稳定版、发行版、测试版,并将其存储起来以供以后使用。有人能给我指出将他们的选择/输入存储在变量而不是临时文件中的方向吗?因为它没有正确获取我试图获取的变量。如果[“$\u return”==“Stable”| |“$\u return”==“Release”| |“$\u return”==“Beta”],那么我需要将他们选择的内容保存到一个变量中,以便以后使用,这就是最终打开的目的。这个变量保存在变量
    $\u return
    中,您也可以使用参数调用函数,尽管我可以付钱给您来修复它吗?:)有些东西不管用?对我来说,在perl上重写这篇文章比在bash上更容易:)
    startup()
    {
      exec 3>&1 
      _return=$(dialog --menu "Tiers are currently set as the following. Which would you like to update?    \n" 12 78 5 \
      "Stable" "$(cat ${DIR}/.tiers|grep Stable|sed 's/Stable=//g')" "Release" "$(cat     ${DIR}/.tiers|grep Release|sed 's/Release=//g')" "Beta" "$(cat ${DIR}/.tiers|grep Beta|sed     's/Beta=//g')"  2>&1 1>&3)
       exitcode=$?
       exec 3>&-;
        # OK is pressed
      if [ "$exitcode" == "0" ] ; then
        if [[ "$_return" == "Stable" || "$_return" == "Release" || "$_return" == "Beta" ]] 
        then
           stable
        fi
      fi
      echo "You have now exited the application"      
      clean_up;
    }
    
    dialog --msgbox "WARNING!!!!\n\n The folder $(${VERSION}) does not
    
     VERSION=`cat .version`
    
    #declaration function_name() { parameter=$1; echo "$parameter" } var=value #run function function_name var