我必须编辑一个给我的脚本,该脚本将检查用户是否对用户主目录中名为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后没有任何反应。它只是坐在那里让我继续输入东西,并没有继续通过那部分。为什么要这样做?
答案 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”,无论你想对文件做什么。这是阻止执行脚本的命令。