Shell脚本没有读取输入

时间:2015-03-26 19:20:50

标签: bash shell input

我编写了一个备份和恢复文件的脚本。我有一个问题,当用户输入' 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

1 个答案:

答案 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脚本错误。