我正在编写一个解决方案,其中,当从服务器中删除共享驱动器时,我们也需要从fstab中删除该条目。
到目前为止我做了什么:
MP="${ServerAddress}:${DirectoryPath} ${MountPoint} nfs defaults 0 0"
while read line; do
if [ "${MP}" = "${line}" ]; then
sed "/${line}/d"
fi
done < /etc/fstab
这是一个错误&gt;&gt; sed:1:“/ servername.net ...”:命令我期望\后跟文本
请建议可以删除。
PS:我作为脚本的一部分运行它,所以我不必单独运行它。使用建议的选项运行时,我可以删除..但在脚本中,这不起作用并给出该错误。人们评论“或格式化,它只是我不能从那里复制,因为那是一个远程通过终端服务器。
答案 0 :(得分:3)
尝试以下方法:
sed -i.bak "\@^$SERVERADDR:$DIRPATH@d" /etc/fstab
为SERVERADDR和DIRPATH设置有意义的值之后。该行还将备份旧文件(名为fstab.bak
)。但由于/etc/fstab
是一个非常重要的文件,请确保有更多备份。
让我指出你只需要那一行,没有while循环,没有脚本!
答案 1 :(得分:2)
请注意,shell区分大小写,并期望"
为双引号,而不是”
(此问题现已解决)。您需要将编辑器配置为不随机为您大写单词(现在也已修复)。请注意,对系统配置文件进行试验是A Bad Idea™。制作文件的副本并在副本上进行实验。只有当您确定脚本在副本上有效时才会冒实时文件的风险。然后在进行更改之前备份实时文件。 (并且尽可能避免以root身份进行实验;这可以限制你可以做的伤害。)
您编写的脚本也可能不使用sed
。将比较更改为!=
,只需使用echo "$line"
即可回显您想要标准输出的行。
MP="${ServerAddress}:${DirectoryPath} ${MountPoint} nfs defaults 0 0"
while read line; do
if [ "${MP}" != "${line}" ]; then
echo "$line"
fi
done < /etc/fstab
或者,您可以在单个命令中使用sed
。唯一的技巧是模式可能包含斜杠,因此\@
符号表示'使用@
作为搜索标记'。
MP="${ServerAddress}:${DirectoryPath} ${MountPoint} nfs defaults 0 0"
sed -e "\@$MP@d" /etc/fstab
如果你有GNU sed
,当你对此感到满意时,你可以添加-i.bak
选项来覆盖/etc/fstab
文件(在{{中保留原文的副本) 1}})。或者使用/etc/fstab.bak
获取当前日期/时间的备份扩展名。或者对文件使用版本控制。