Параметры извлечения перед последним параметром в “$”

Всего несколько предложений:

  • Снимки экрана могли бы быть простым способом, но необходимо будет удостовериться, что код в изображении является достаточно большим и достаточно ясным читать. (не целый снимок экрана, просто соответствующая часть)
  • , Если можно встроить HTML тогда, существует много инструментов для генерации выделенного HTML синтаксиса.
62
задан tshepang 12 June 2014 в 13:09
поделиться

7 ответов

Чтобы удалить последний элемент из массива, вы можете использовать что-то вроде этого:

#!/bin/bash

length=$(($#-1))
array=${@:1:$length}
echo $array

Еще более короткий способ:

array=${@:1:$#-1}

Но араи - это Башизм , старайтесь избегать использования их: (.

93
ответ дан 24 November 2019 в 16:38
поделиться
#!/bin/sh

eval last='$'$#
while test $# -gt 1; do
    list="$list $1"
    shift
done

echo $list $last

0
ответ дан 24 November 2019 в 16:38
поделиться

Спасибо, ребята, все готово, вот финальный сценарий 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
5
ответ дан 24 November 2019 в 16:38
поделиться

Несколько решений уже были опубликованы; однако я бы посоветовал реструктурировать ваш скрипт так, чтобы имя архива было первым параметром , а не последним. Тогда это действительно просто, поскольку вы можете использовать встроенную функцию shift для удаления первого параметра:

ARCHIVENAME="$1"
shift
# Now "$@" contains all of the arguments except for the first
11
ответ дан 24 November 2019 в 16:38
поделиться

Я не могу найти способ использовать нотацию индекса массива в $ @ , так что это лучшее, что я могу сделать:

#!/bin/bash

args=("$@")
echo "${args[$(($#-1))]}"
0
ответ дан 24 November 2019 в 16:38
поделиться
#!/bin/bash

lastidx=$#
lastidx=`expr $lastidx - 1`

eval last='$'{$lastidx}
echo $last
1
ответ дан 24 November 2019 в 16:38
поделиться
last_arg="${!#}" 
19
ответ дан 24 November 2019 в 16:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: