Диалог в bash не захватывает переменные правильно
У меня проблема с согласованностью этого script. Вы можете запускать его один раз, без каких-либо проблем. Однако, если вы сразу загрузите его и запустите его снова, он не будет правильно перехватывать переменные, потому что результат не записывается в файлы правильным образом.
Пример:
Эта утилита предназначена для по существу обновления 4 файлов..temp,.tiers,.version и .sync
На разных этапах через диалоговые подсказки он обновляет файл. Моя проблема заключается в том, что несколько раз она не обновляет файл, и я не могу найти причину, поскольку она только после того, как вы уже запускали ее один раз. Я уничтожаю файлы при запуске, поэтому я не уверен, что это за сделка. Как будто он захватывает его исключительно из памяти?
Во всяком случае, чтобы проверить это, вам понадобится следующий файл в /test
Спасибо всем, кто может дать мне несколько советов.
cat .tiers
Stable=1
Release=2
Beta=3
CODE:
#!/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}).\n\n 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 "\n\n
$(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.\n\n
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!!!!\n\n 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
}
Ответы
Ответ 1
Вы можете использовать этот метод для непосредственного захвата диалога otput в переменную:
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!!!!\n\n The folder $(${VERSION}) does not
как я понимаю из кода, он будет запускать пустую команду, поскольку .version пуста при запуске и
VERSION=`cat .version`
в tier_update_prompt()
$ VERSION все еще пустая строка,
Я попытался восстановить ваш код, но он превратил его в вопль, поэтому предложения:
- получить результаты диалога, как показано выше.
- запустить функции с параметрами:
#declaration
function_name() {
parameter=$1;
echo "$parameter"
}
var=value
#run function
function_name var
- не перекомплексированность с помощью ${VAR},
- помните, что двойные кавычки расширяются, поэтому
echo "here is $var"
вместо echo "here is $(echo ${var})"
- используйте как менее временные файлы, например, вы можете:
diff <(ls dir1) <(ls dir2)
- не сохраняйте рабочие файлы в корневом каталоге (например,/test/)
- не работают как root
- узнать perl