【问题标题】:Linux deletion scriptLinux删除脚本
【发布时间】:2010-11-11 12:54:49
【问题描述】:

我编写了一个 shell 脚本(称为 Trash.sh),运行时会显示我的“垃圾箱”目录中的所有文件,并询问用户是否希望逐个删除每个文件。脚本如下:

#if directory is empty, display message
if test ! -f ~/dustbin/* 
then
echo "Directory is empty"
#if directory is not empty, then display each item and ask to delete
else
for resfile in ~/dustbin/* #for each file in directory, store it in resfile variable
do
    if test -f $resfile ; then #if a file exists
    echo "Do you want to delete $resfile?"
    echo "Enter y or n"
    read ans #store user input in ans variable
    if test $ans = y ; then
    rm $resfile
    echo "File $resfile was deleted"
    fi
    fi
done
fi

这对我来说很好。当用户键入sh Trash.sh 时,脚本会正常运行,每个文件都会显示出来,并询问用户是否删除它。但是我想添加的是用户输入sh Trash.sh -a的选项,并且目录中的所有文件都可以在不确认的情况下自动删除。

我有点不知道如何实现这一点。有什么想法吗?

ps - 我正在使用 Mac OS X 10.6.4 并通过终端完成所有操作

【问题讨论】:

  • 请不要用基于答案的新版本替换您的原始版本。它使答案没有任何意义。如果有必要,最好在原版下方添加明确标记的修订版。

标签: linux macos bash shell


【解决方案1】:

我建议使用 getopts 捕获 -a 选项。然后稍后对其进行测试并使用 rm -f (强制,请参阅手册页)。 Mac OS 上的 shell 与我习惯的有点不同,但 Linux 上 bash 中的处理选项看起来像这样:

force_all='f';
while getopts "ahv" arg
do
    case $arg in
        a) force_all='t';;
        v) echo "$SCRIPT: $VERSION"; exit;;
        h|*) echo "$SCRIPT: $HELP"; exit;;
    esac
done

这个例子展示了如何实现 -v 版本和 -h 帮助。

【讨论】:

  • 我通常写force_all=false ... force_all=true -- 然后你可以说if $force_all; then ...
【解决方案2】:

首先要学习如何在 bash 脚本中进行参数解析。

简短的回答是使用变量 $1、$2、$N($0 是您正在执行的 bash 脚本的名称)。 $* 是一个包含所有参数的字符串。这就是您在 bash 脚本和自定义 bash 函数中获取参数的方式。在您的情况下,像

这样的简单测试
if [[ $1 == "-a" ]]
then
  #profit!
fi

长答案是使用和学习 getopts:http://www.mkssoftware.com/docs/man1/getopts.1.asp

【讨论】:

  • 当你知道怎么做时很容易!非常感谢大家的帮助。
  • 他写了一个shell脚本,而不是bash脚本(至少他没有说bash)。 [[ … ]] 在 sh 中不起作用
  • 假设是 bash,因为他说他使用的是 Mac OSX
  • 我的错,我应该说我写了一个 bash 脚本而不是 shell。
【解决方案3】:

我还建议使用纯 rm 请求删除:

rm -riv ~/dustbin/*

正如其他答案中所述,毫无疑问地删除:

rm -rfv ~/dustbin/*

【讨论】:

    【解决方案4】:

    试试:

    if [ x"$1" = x"-a" ]; then
      rm -rf ~/dustbin/*;
      exit 0;
    fi
    

    在脚本的顶部

    【讨论】:

    • 你的意思可能是:[ x"$1" = "x-a" ]
    • @glenn:任何一个都可以,因为在评估字符串时会删除引号。 ([ "x$1" = "x-a" ] 也是如此)在等号左边的部分甚至很明显。如果您使用这个古老的成语,最好使用并行结构(x 在两边的引号之外),这样更容易看到正在做什么。使用现代 shell,as long as the variable is quoted,不再需要 x
    • @dennis:起初我错过了右侧的 x,此后我已经编辑了我的问题
    • 对不起(对你也是,格伦),我应该看看编辑历史记录。
    【解决方案5】:

    检查$1 是否为-a。如果是这样,请删除所有文件然后退出。

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多