我似乎在编写一段代码时出现问题(至少我认为无论如何)。这是一个脚本,它解析一个名为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
答案 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处理,具体取决于平台。