0

我似乎在编写一段代码时遇到了麻烦(至少我认为无论如何)。这是一个脚本,它解析一个名为 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
4

1 回答 1

5

您的脚本有很多问题:

  • shebang 行应为#!/bin/sh(missing #),或#!/usr/bin/env sh

  • 变量引用{$USER_ID}不是您想要的 -${USER_ID}是正确的形式(通常,就$USER_ID足够了)。

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

显示的命令行帮助(不是手册页)的一种可能解释$USER_ID是空的 - 生成的无效语法然后导致userdel实用程序显示其命令行帮助。

最后,还有一些简化脚本的方法:

  • 仅当您在同一行放置更多语句;时才需要语句结尾。

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

(*):正如@thom 指出的那样[test如果您的脚本必须保持 POSIX 兼容,那么它们仍然占有一席之地。相比之下,在特定于 bash 的脚本中[[更可取,因为它比http://mywiki.wooledge.org/BashFAQ/031更易于使用并且具有更多功能[。 请注意,指定了 OP 的 shebang 行- 这可能会或可能不会导致 bash 处理,具体取决于平台。
sh

于 2013-11-07T03:15:57.510 回答