显示在sh脚本结尾的手册页

时间:2013-11-07 03:03:00

标签: bash shell man

我似乎在编写一段代码时出现问题(至少我认为无论如何)。这是一个脚本,它解析一个名为test3_data.txt的文本文件,其中包含一堆用户ID,并将这些用户ID放入一个名为“USER_ID”的变量中。然后我测试它们是否有一个主目录,其中包含USER_ID变量中的任何文本。如果是这样,它将从系统中删除用户及其文件,主目录等。该脚本工作正常,但是当它完成运行时,userdel命令的手册页会显示出来。反正有没有阻止这种情况发生?我的代码有问题吗?谢谢!这是我的代码。

!/bin/sh

while read IN_RECORD
do


#Variable that reads user id

USER_ID=`echo $IN_RECORD |cut -d'|' -f1`

#Remove added users from data file.

test -d /home/{$USER_ID}

if [ "$?" = "1" ];
then
userdel -r $USER_ID
fi

done < test3_data.txt

1 个答案:

答案 0 :(得分:5)

您的脚本有很多问题:

  • shebang系列应为#!/bin/sh(缺少#)或#!/usr/bin/env sh

  • 变量引用{$USER_ID}与您的意图不同 - ${USER_ID}是正确的形式(通常只有$USER_ID就足够了。)

  • 您错误地测试了成功:它是退出代码 0 ,而不是1表示成功。此外,在bash脚本中,您应该使用[[而不是已弃用的[进行测试。 (*)

命令行帮助(不是手册页)显示的一个可能的解释是$USER_ID为空 - 由此产生的无效语法会导致userdel实用程序显示其命令行帮助。< / p>

最后,有一些方法可以简化你的脚本:

  • 只有在同一行上放置更多语句时才需要结束语句;

  • 您的测试可以合并为一个语句:if [ -d "/home/$USER_ID" ]; then

(*):正如@thom指出的那样,[test仍有其位置,如果您的脚本必须符合POSIX标准。相比之下,在特定于bash的脚本中,[[更可取,因为它使用起来更方便,功能更多,而不是[ - 请参阅http://mywiki.wooledge.org/BashFAQ/031
请注意,OP的shebang行指定了sh - 这可能会也可能不会导致bash处理,具体取决于平台。