提问人:ILovePizza 提问时间:3/15/2022 最后编辑:Daniel WiddisILovePizza 更新时间:10/23/2022 访问量:160
Bash 脚本失败,并出现多个参数
bash script fail with more then one parameters
问:
我有以下脚本:
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,句点。
答:
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 变量,以避免与其他函数中使用的变量发生潜在冲突。通常,对仅在函数中使用的变量进行本地化是一个好主意。
SaveFolder
var
- 文件是否存在的测试现在只使用 .旧的测试并不可靠,因为在文件系统中可能会找到一些东西,这些东西既不是文件也不是目录(例如fifos,套接字,设备)。
-e
- 使用 () 选项可获得更易于使用程序处理的输出。
-i
--mime
file
- 将 的大多数用法替换为 。请参阅公认的优秀答案 为什么 printf 比 echo 更好?.
echo
printf
- 修复了虚线。
case
- 将 的用法替换为“.我猜当函数更新为接受多个参数时,代码没有完全更新。
$1
"$var
- 通常添加引号(如 Shellcheck 建议的那样)如果输入文件的名称中包含空格或 shell 通配元字符,则避免中断。请参阅 Quotes 的 When Should You Quote? 部分 - Greg's Wiki
- 必要时添加到命令中,以防止输入文件的名称以 开头时出现问题。请参阅 Bash Pitfalls #2 (cp $file $target)。
--
-
- 请注意,我只对用于解压缩文件的命令进行了非常粗略的测试。其中一些可能存在问题。
评论
case [ ... ]
file
$(...)
case [ file -b in "$var" ]
isn't case [ ... ] simply a switch case?
case string in string)
[
]
case "$(file -b in "$var")"