用于提取档案的 BASH 脚本 - 如何让脚本询问文件夹目标?

用于提取档案的 BASH 脚本 - 如何让脚本询问文件夹目标?

我已开始使用下面的 bash 脚本来解压档案。我该如何让脚本询问我是否要指定文件夹,或者只是使用默认文件夹来解压?

我希望能够运行存档脚本,并得到提示:

“提取至默认文件夹 Y,或 N,而是指定文件夹(输入文件夹)。如能提供任何帮助,不胜感激 :)

摘录自 .bashrc

extract () {
if [ -f $1 ] ; then
  case $1 in
    *.tar.bz2)   tar xjf $1     ;;
    *.tar.gz)    tar xzf $1     ;;
    *.bz2)       bunzip2 $1     ;;
    *.rar)       unrar e $1     ;;
    *.gz)        gunzip $1      ;;
    *.tar)       tar xf $1      ;;
    *.tbz2)      tar xjf $1     ;;
    *.tgz)       tar xzf $1     ;;
    *.zip)       unzip $1       ;;
    *.Z)         uncompress $1  ;;
    *.7z)        7z x $1        ;;
    *)     echo "'$1' cannot be extracted via extract()" ;;
     esac
 else
     echo "'$1' is not a valid file"
 fi
}

答案1

至于您的代码:

  • 不要把错误信息放到STDOUT,那里有STDERR适合它们的东西。
  • 不要忘记将文件名(以及一般的可验证文件)括在引号中。如果包含空格tar xjf $1则不起作用。$1
  • gunzip并且bunzip2不使用-k( --keep) 选项会在解压后删除压缩文件。您确定要它吗?
  • GNUtar可以自行检测压缩格式,只是不要强制它:$ tar xf "$1"。但让它按照你的意愿。

至于任务,我不会将其作为函数来实现,.bashrc而是作为脚本来实现。所以我认为它可能看起来像这样:

#!/bin/bash

# config
DEFAULT_TARGET="."

SCRIPTNAME="${0##*/}"

err() {
    printf >&2 "$SCRIPTNAME: $*\n"
    exit 1
}

ARC="$1"
[[ -f $ARC ]] || err $"'$ARC' does not exist"
ARC="$(readlink -f "$ARC")"

read -p "Extract to [default: $DEFAULT_TARGET]: " TARGET
[[ -z $TARGET ]] &&\
    TARGET="$DEFAULT_TARGET"
[[ -d $TARGET ]] || err $"Directory '$TARGET' does not exist"
[[ -w $TARGET ]] || err $"Permission denied: '$TARGET' is not writable"

cd "$TARGET"
case "$ARC" in
    *.tar.bz2)   tar xjf "$ARC"     ;;
    *.tar.gz)    tar xzf "$ARC"     ;;
    *.bz2)       bunzip2 "$ARC"     ;;
    *.rar)       unrar e "$ARC"     ;;
    *.gz)        gunzip "$ARC"      ;;
    *.tar)       tar xf "$ARC"      ;;
    *.tbz2)      tar xjf "$ARC"     ;;
    *.tgz)       tar xzf "$ARC"     ;;
    *.zip)       unzip "$ARC"       ;;
    *.Z)         uncompress "$ARC"  ;;
    *.7z)        7z x "$ARC"        ;;
    *)           echo "'$ARC' cannot be extracted by $SCRIPTNAME" ;;
esac

您需要任何评论吗?

相关内容