Bash 脚本失败,并出现多个参数

bash script fail with more then one parameters

提问人:ILovePizza 提问时间:3/15/2022 最后编辑:Daniel WiddisILovePizza 更新时间:10/23/2022 访问量:160

问:

我有以下脚本:

function unpack(){
echo "starting";
SaveFolder=/home/"$USER"/Desktop/folde

for var in "$@"
do

if [ -f "$var" ] || [ -d "$var" ]  ; then

case [ file -b in "$var"   ]

  *directory*)
    echo  "file is directory"

    ;;

  *Zip*)
    echo  "file is Zip, use unZip"
    unzip -o $1 -d "$SaveFolder"
    ;;


   *gzip*)
   echo   "file is gzip, use gunzip"
   cp $1   "$SaveFolder"
   gunzip -N -d -f  "$SaveFolder"/$1;

   ;;

    *bzip2*)
     echo   "file is bunzip2, use bunzip"
     bzip2 -dk $1
    cp $1 "$SaveFolder"/
    bzip2 -d -f "$SaveFolder"/$1;
    ;;

   *compress*)
   echo  "uncompress file ending, use ncompress"
    ;;

  *)
      echo "not a valid file"
    ;;
esac
fi
done
}

当我使用一个参数调用函数时,它运行良好,例如:

unpack test.zip

但如果我尝试:

unpack test.zip test.bz2

我收到此错误:

未找到中央目录末尾签名。此文件不是 一个 zipfile,或者它构成一个多部分存档的一个磁盘。在 后一种情况是,中心目录和 zipfile 注释将在 此存档的最后一个磁盘。 解压缩:在 archive.bz2 或 archive.bz2.zip,并且找不到archive.bz2.ZIP,句点。

bash 函数 ubuntu 参数传递

评论

2赞 choroba 3/15/2022
你知道什么是吗?使用那里肯定是错误的,也许你想代替?case [ ... ]file$(...)
0赞 ILovePizza 3/15/2022
为什么?case [ ... ] 不就是一个开关案例吗?
0赞 KamilCuk 3/15/2022
这是怎么回事? 是的,但它是.没有.case [ file -b in "$var" ]isn't case [ ... ] simply a switch case?case string in string)[]
0赞 Philippe 3/15/2022
你的意思case "$(file -b in "$var")"

答:

0赞 pjh 3/15/2022 #1

试试这个 Shellcheck-clean 修改后的代码版本:

#! /bin/bash -p

function unpack
{
    echo "starting"

    local -r SaveFolder=$HOME/Desktop/folde

    local var
    for var in "$@"; do
        if [[ ! -e $var ]]; then
            printf "WARNING: '%s' does not exist\\n" "$var" >&2
            continue
        fi

        case $(file -bi -- "$var") in
            'inode/directory;'*)
                printf "'%s' is a directory\\n" "$var"
                ;;

            'application/zip;'*)
                printf "'%s' is a Zip file, use unZip\\n" "$var"
                unzip -o -d "$SaveFolder" -- "$var"
                ;;

            'application/gzip;'*)
                printf "'%s' is a gzip file, use gunzip\\n" "$var"
                cp -- "$var" "$SaveFolder"
                gunzip -N -d -f -- "$SaveFolder/$var"
                ;;

            'application/x-bzip2;'*)
                printf "'%s' is a bzip2 file, use bunzip\\n" "$var"
                bzip2 -dk -- "$var"
                cp -- "$var" "$SaveFolder"
                bzip2 -d -f -- "$SaveFolder/$var"
                ;;

            'application/x-compress;'*)
                printf "'%s' is a compress file, use uncompress\\n" "$var"
                ;;

            *)
                printf "'%s' is not a supported file\\n" "$var"
                ;;
        esac
    done
}
  • 我本地化了 and 变量,以避免与其他函数中使用的变量发生潜在冲突。通常,对仅在函数中使用的变量进行本地化是一个好主意。SaveFoldervar
  • 文件是否存在的测试现在只使用 .旧的测试并不可靠,因为在文件系统中可能会找到一些东西,这些东西既不是文件也不是目录(例如fifos,套接字,设备)。-e
  • 使用 () 选项可获得更易于使用程序处理的输出。-i--mimefile
  • 将 的大多数用法替换为 。请参阅公认的优秀答案 为什么 printf 比 echo 更好?.echoprintf
  • 修复了虚线。case
  • 将 的用法替换为“.我猜当函数更新为接受多个参数时,代码没有完全更新。$1"$var
  • 通常添加引号(如 Shellcheck 建议的那样)如果输入文件的名称中包含空格或 shell 通配元字符,则避免中断。请参阅 Quotes 的 When Should You Quote? 部分 - Greg's Wiki
  • 必要时添加到命令中,以防止输入文件的名称以 开头时出现问题。请参阅 Bash Pitfalls #2 (cp $file $target)。---
  • 请注意,我只对用于解压缩文件的命令进行了非常粗略的测试。其中一些可能存在问题。