Всего несколько предложений:
Чтобы удалить последний элемент из массива, вы можете использовать что-то вроде этого:
#!/bin/bash
length=$(($#-1))
array=${@:1:$length}
echo $array
Еще более короткий способ:
array=${@:1:$#-1}
Но араи - это Башизм , старайтесь избегать использования их: (.
#!/bin/sh eval last='$'$# while test $# -gt 1; do list="$list $1" shift done echo $list $last
Спасибо, ребята, все готово, вот финальный сценарий 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
Несколько решений уже были опубликованы; однако я бы посоветовал реструктурировать ваш скрипт так, чтобы имя архива было первым параметром , а не последним. Тогда это действительно просто, поскольку вы можете использовать встроенную функцию shift
для удаления первого параметра:
ARCHIVENAME="$1"
shift
# Now "$@" contains all of the arguments except for the first
Я не могу найти способ использовать нотацию индекса массива в $ @
, так что это лучшее, что я могу сделать:
#!/bin/bash
args=("$@")
echo "${args[$(($#-1))]}"
#!/bin/bash
lastidx=$#
lastidx=`expr $lastidx - 1`
eval last='$'{$lastidx}
echo $last