我编写了一个备份和恢复文件的脚本。我有一个问题,当用户输入' 2'对于恢复,程序说这是一个无效的输入,所有其他选项工作正常。我觉得我错过了一些小事但我无法解决它
更新和恢复脚本
#!/bin/bash
ROOT="/Users/Rory/Documents"
ROOT_EXCLUDE="--exclude=/dev --exclude=/proc --exclude=/sys --exclude=/temp --exclude=/run --exlucde=/mnt --exlcude=/media --exlude=/backup2.tgz"
DESTIN="/Users/Rory/test/"
BACKUP="backup2.tgz"
CREATE="/dev /proc /sys /temp /run /mnt /media "
if [ "$USER" != "root" ]; then
echo "You are not the root user"
echo "To use backup please use: sudo backup"
exit
fi
clear
echo "************************************************"
echo "********* Backup Menu **************************"
echo "************************************************"
OPTIONS="BACKUP RESTORE DESTINATION EXIT"
LIST="1)BACKUP 2)RESTORE 3)DESTINATION 4)EXIT"
select opt in $OPTIONS; do
if [ "$opt" = "EXIT" ]; then
echo "GOODBYE!"
sleep 3
clear
exit
elif [ "$opt" = "BACKUP" ]; then
echo "BACKING UP FILES..."
sleep 2
tar cvpfz $DESTIN/backup.`date +%d%m%y_%k:%M`.tgz $ROOT $ROOT_EXCLUDE_DIRS
echo "BACKUP COMPLETE"
sleep 2
exit
elif [ "$opt" = "RESTORE" ]; then
echo "RESTOTING FILES..."
sleep 2
tar xvpfz $BACKUP_FILE -C /
sleep2
echo "RESTORE COMPLETE..."
if [[ -e "/proc" ]]; then
echo "$CREATE_DIRS allready exists! "
else
mkdir $CREATE_DIRS
echo "$CREATE_DIRS are created! "
fi
exit
elif [ "$opt" = "DESTINATION" ]; then
echo "CURRENT DESTINATION: $DEST_DIR/backup.`date +%d/%m/%y_%k:%M`.tgz "
echo "TO CHANGE ENTER THE NEW DESTINATION..."
echo "TO LEAVE IT AS IS JUST PRESS ENTER..."
read NEW_DESTIN
#IF GREATER THEN 0 ASSIGN NEW DESTINATION
if [ ${#NEW_DESTIN} -gt 0 ]; then
DESTIN = "$NEW_DESTIN"
fi
clear
echo $BANNER1
echo $BANNER2
echo $BANNER3
echo $LIST
else
clear
echo "BAD INPUT!"
echo "ENTER 1 , 2, 3 or 4.."
echo $LIST
fi
done
答案 0 :(得分:0)
除非您错过了设置ROOT_EXCLUDE
(第4行)的结尾引号,否则我看起来没问题。我认为缺少的引用是转录错误,或者你的程序根本不会真正起作用。
我已经尝试过这个程序,它似乎有效。
调试技巧是让set -xv
打开脚本中的调试,set +xv
将其关闭。 -x
表示在执行前打印出行,-v
表示在shell插入行后打印出行。
我确信一旦你的程序中有set -xv
,你就会立即看到问题。
作为其中一部分,您可以在打印调试信息时将PS4
设置为行提示以进行打印。我喜欢像这样设置PS4:
export PS4="[\$LINENO]> "
这样,行提示打印出它正在执行的行,这很好。
在你的情况下,我会在你设置set -xv
然后在程序的最后设置OPTIONS
。通过这种方式,您可以看到if
比较,并可能发现您的问题。
export PS4="[\$LINENO]> "
set -xv
OPTIONS="BACKUP RESTORE DESTINATION EXIT"
LIST="1)BACKUP 2)RESTORE 3)DESTINATION 4)EXIT"
select opt in $OPTIONS; do
if [ "$opt" = "EXIT" ]; then
echo "GOODBYE!"
set +xv
顺便说一句,最好使用像[[ ... ]]
这样的双方括号进行测试,而不是像[ ... ]
那样使用单个方括号。这与shell在测试中插值的方式有关。
[ ... ]
是内置test
命令的别名。 shell按原样插入行,然后执行整行。
[[ ... ]]
是一个复合语句,其中shell将插入变量,但不是整行。这条线保持整体:
foo="one thing"
bar="another thing"
这将有效:
if [ "$foo" = "$bar" ]
then
echo "Foo and bar are the same"
fi
这不会:
if [ $foo = $bar ]
then
echo "Foo and bar are the same"
fi
shell按原样插入行:
if [ one thing = another thing ]
这与:
相同if test one thing = another thing
test
命令查看第一项以查看它是标准测试,还是假定三项,第二项是比较。在这种情况下,两者都不是。
然而,这将有效:
if [[ $foo = $bar ]] # Quotes aren't needed
then
echo "Foo and bar are the same"
fi
[[ ... ]]
是复合命令,$foo
和$bar
将替换为其值,但会保留其位置。因此,=
被识别为比较运算符。
使用[[ ... ]]
代替[ ... ]
已经解决了很多难以找到的shell脚本错误。