我的bash脚本有什么问题?

时间:2013-11-22 02:49:41

标签: bash

我必须编辑一个给我的脚本,该脚本将检查用户是否对用户主目录中名为journal-file的文件具有写权限。如果日志文件存在且用户没有对文件的写入权限,则脚本应采取适当的操作。

这是我到目前为止所写的内容:

    if [ -w $HOME/journal-file ]
        then
            file=$HOME/journal-file
            date >> file
            echo -n "Enter name of person or group: "
            read name
            echo "$name" >> $file
            echo >> $file
            cat >> $file
            echo "--------------------------------" >> $file
            echo >> $file
            exit 1
        else
            echo "You do not have write permission."
            exit 1
    fi

当我运行脚本时,它会提示我输入人员/组的名称,但在按下Enter后没有任何反应。它只是坐在那里让我继续输入东西,并没有继续通过那部分。为什么要这样做?

4 个答案:

答案 0 :(得分:3)

声明:

cat >>$file

将从标准输入读取并写入文件。这意味着它将等到你用CTRL-D之类的东西指示文件结束。它与在命令行输入cat并且看到在输入内容之前没有任何反应直到您指示文件结束之前没有什么不同。

如果您尝试将另一个文件附加到输出文件,则需要指定其名称,例如cat $HOME/myfile.txt >>$file

如果您要在其中填空,请使用echo而不是cat,例如echo >>$file

你还有其他一些问题,第一个是:

date >> file

因为那会尝试创建一个名为file的文件(在您的工作目录中)。请改用$file

第二个是1的退出代码,在你尝试做的事情成功的情况下。现在这可能不是问题,但是稍后使用它的人可能想知道为什么它似乎总是表示失败。

说实话,我并不是if ... then return else ...构造的忠实粉丝。我更喜欢快速失败,减少缩进和更好的输出重定向分组,例如:

file=${HOME}/journal-file
if [[ ! -w ${file} ]] ; then
    echo "You do not have write permission."
    exit 1
fi

echo -n "Enter name of person or group: "
read name
(
    date
    echo "$name"
    echo
    echo "--------------------------------"
    echo
) >>${file}

我相信它更具可读性和可维护性。

答案 1 :(得分:1)

就是这一行

cat >> $file

cat将来自标准输入(即您输入的任何内容)的输入连接到$file

答案 2 :(得分:1)

我认为这部分 cat >> $file 复制从stdin到文件的所有内容。也许如果您隐藏Ctrl + D(文件结尾),脚本可以继续。

答案 3 :(得分:0)

1)您最好先检查文件是否存在:

[[ -e $HOME/journal-file ]] || \
    { echo "$HOME/journal-file does not exist"; exit 1 }

2)你必须改变“cat>> $ file”,无论你想对文件做什么。这是阻止执行脚本的命令。