bash中的对话框没有正确获取变量



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

例如:此实用程序主要用于更新4个文件。temp、.tiers、.version和.sync在对话框提示的不同阶段,它会更新文件。我的问题是,有时它不会更新文件,我找不到任何原因,因为只有在你已经运行过一次之后。我在启动时会擦除文件,所以我不确定这是怎么回事。这就像它只是从内存中获取文件一样?

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

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

cat .tiers
Stable=1
Release=2
Beta=3

代码:

#!/usr/bin/env bash
touch .version
touch .temp
VERSION=`cat .version`
DIR=/test/
STORED=`cat ${DIR}/.temp`
################################
#     REARRANGE TIERS          #
################################
rearrange()
{
start
end
}

################################
#     SYNC FILE EXISTS         #
################################
sync_exists()
{
dialog --msgbox ".sync exists in the directory $(echo ${VERSION}).nn Use Tier Move                 instead." 10 40
clean_up
exit 1;
}

################################
#         CLEAN UP             #
################################
clean_up()
{
rm -rf .version
rm -rf .update
rm -rf .temp
}
################################
#     OPTOUT & CLEAN UP        #
################################
opt_out()
{
dialog --msgbox "You've opted out of the tier update." 5 40
rm -rf ${DIR}/.version ${DIR}/.update ${DIR}/.temp 
}

################################
#     UPDATE .TIERS FILE       #
################################
tier_updater()
{
dialog --msgbox "nn
$(cat ${DIR}/.temp) is now $VERSION." 8 27
sed -i s/${STORED}=.*/${STORED}=${VERSION}/g ${DIR}/.tiers
clean_up
}

################################
#     UPDATE FILE LIST         #
################################
file_updater()
{
rm -rf ${VERSION}/.sync
for x in `find $VERSION -type d ( ! -iname "." )|sed s/${VERSION}//g`; do echo     "d===$x===755" >> ${DIR}/${VERSION}/.sync ; done
for y in `find $VERSION -type f ( ! -iname ".*" )|sed s/${VERSION}//g`; do     echo "f===$y===644===`md5sum ${VERSION}"$y"|awk '{print $1}'`" >>     "${DIR}"/"$VERSION"/.sync;done
find "${DIR}"/"${VERSION}" -type f -exec gzip -f '{}' ; > /dev/null 2>&1      |xargs gzip -d "${DIR}"/${VERSION}/.sync
}

################################
#     TIER UPDATE PROMPT       #
################################
tier_update_prompt()
{
if [ -f ${VERSION}/.sync ]; then  sync_exists
else file_updater
fi
dialog --menu "n
Directory List Built.n
File List Built.n
Files Compressed.n
Sync File in place.nn
Would you like to update the tier for $(cat ${DIR}/.temp)?"  15 60 2  "Yes" "This will     apply all changes for $(echo $VERSION) to $(cat ${DIR}/.temp)." "No" "This will revert all     changes." 2>&1 > ${DIR}/.update
if [ "$?" = "0" ] ; then
_update=$(cat ${DIR}/.update)
if [ "$_update" = "Yes" ] ; then
tier_updater
fi
if [ "$_update" = "No" ] ; then
opt_out ;
fi
else
echo "You have now exited the application"
clean_up;
fi
}
################################
#     NEW VERSION INPUT        #
################################ 
stable()
{
dialog --inputbox "Enter the new version for $(cat ${DIR}/.temp)" 8 30 2>     "${DIR}"/.version
if [ -d `cat .version` ] ; then tier_update_prompt;
else
dialog --msgbox "WARNING!!!!nn The folder $(${VERSION}) does not     exist!nPlease upload this folder before you proceed!" 8 50 ;
clean_up
fi
}
################################
#        TIER SELECTION        #
################################
startup()
{
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> "${DIR}"/.temp
# OK is pressed
if [ "$?" = "0" ] ; then
_return=$(cat ${DIR}/.temp)
fi
if [ "$_return" = "Stable" ] ; then
stable
fi
if [ "$_return" = "Release" ] ; then
stable
fi
if [ "$_return" = "Beta" ] ; then
stable
else 
echo "You have now exited the application"      
clean_up;
fi
}

您可以使用该方法将对话框直接捕获到变量中:

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

http://mywiki.wooledge.org/BashFAQ/002

因此,在我的方法中,startup将看起来像:

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

此外,这里还有许多不干净的东西,比如$(${VERSION}):

dialog --msgbox "WARNING!!!!nn The folder $(${VERSION}) does not

正如我从代码中了解到的,它将运行空命令。版本在启动和时是空的

VERSION=`cat .version`

在tier_update_prompt()中$VERSION仍然为空字符串,

我试着重构你的代码,但结果却一团糟

  • 获取如上所示的对话框结果
  • 使用参数运行函数:
#声明函数名称(){参数=$1;echo"$parameter"}var=值#run函数function_name var
  • 不与${var}过复杂
  • 请记住,双引号展开,因此echo "here is $var"而不是echo "here is $(echo ${var})"
  • 尽可能少地使用临时文件,例如:diff <(ls dir1) <(ls dir2)
  • 不要将工作文件保存在根目录中(如/test/)
  • 不以root身份工作
  • 学习perl

相关内容

  • 没有找到相关文章

最新更新