我正在尝试创建一个Bash脚本,它将从命令行提供的最后一个参数提取到一个变量中,以便在别处使用.这是我正在处理的脚本:
#!/bin/bash
# compact - archive and compact file/folder(s)
eval LAST=\$$#
FILES="$@"
NAME=$LAST
# Usage - display usage if no parameters are given
if [[ -z $NAME ]]; then
echo "compact <file> <folder>... <compressed-name>.tar.gz"
exit
fi
# Check if an archive name has been given
if [[ -f $NAME ]]; then
echo "File exists or you forgot to enter a filename. Exiting."
exit
fi
tar -czvpf "$NAME".tar.gz $FILES
Run Code Online (Sandbox Code Playgroud)
由于第一个参数可以是任何数字,我必须找到一种方法来提取最后一个参数,(例如压缩文件.a file.b file.d files-abd.tar.gz).现在,存档名称将包含在要压缩的文件中.有没有办法做到这一点?
小智 93
要从数组中删除最后一项,您可以使用以下内容:
#!/bin/bash
length=$(($#-1))
array=${@:1:$length}
echo $array
Run Code Online (Sandbox Code Playgroud)
小智 19
last_arg="${!#}"
Run Code Online (Sandbox Code Playgroud)
ePi*_*314 14
这就是我在脚本中的做法
last=${@:$#} # last parameter
other=${*%${!#}} # all parameters except the last
Run Code Online (Sandbox Code Playgroud)
编辑
根据一些评论(见下文),这个解决方案比其他解决方案更便携.
请阅读Michael Dimmitt的评论,了解其工作原理.
Ada*_*eld 11
已经发布了几种解决方案; 但是我会建议重构你的脚本,以便存档名称是第一个参数而不是最后一个.然后它非常简单,因为您可以使用shift内置函数删除第一个参数:
ARCHIVENAME="$1"
shift
# Now "$@" contains all of the arguments except for the first
Run Code Online (Sandbox Code Playgroud)
谢谢你们,完成它,继承人最后的bash脚本:
#!/bin/bash
# compact - archive and compress file/folder(s)
# Extract archive filename for variable
ARCHIVENAME="${!#}"
# Remove archive filename for file/folder list to backup
length=$(($#-1))
FILES=${@:1:$length}
# Usage - display usage if no parameters are given
if [[ -z $@ ]]; then
echo "compact <file> <folder>... <compressed-name>.tar.gz"
exit
fi
# Tar the files, name archive after last file/folder if no name given
if [[ ! -f $ARCHIVENAME ]]; then
tar -czvpf "$ARCHIVENAME".tar.gz $FILES; else
tar -czvpf "$ARCHIVENAME".tar.gz "$@"
fi
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24921 次 |
| 最近记录: |