76 votes

Extraire les paramètres avant le dernier paramètre dans "$ @"

J'essaie de créer un script Bash qui extraira le dernier paramètre donné à partir de la ligne de commande dans une variable à utiliser ailleurs. Voici le script sur lequel je travaille:

 #!/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
 

Étant donné que les premiers paramètres peuvent être de n'importe quel nombre, je dois trouver un moyen d'extraire le dernier paramètre (par exemple, compact file.a file.b file.d files-abd.tar.gz). Tel qu'il est maintenant, le nom de l'archive sera inclus dans les fichiers à compacter. Y a-t-il un moyen de faire cela?

110voto

Krzysztof Klimonda Points 679

Pour supprimer le dernier élément du tableau, vous pouvez utiliser quelque chose comme ceci:

 #!/bin/bash

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

12voto

Adam Rosenfield Points 176408

Plusieurs solutions ont déjà été publiées; cependant, je conseillerais de restructurer votre script afin que le nom de l'archive soit le premier paramètre plutôt que le dernier. Ensuite, c'est vraiment simple, car vous pouvez utiliser le shift intégré pour supprimer le premier paramètre:

 ARCHIVENAME="$1"
shift
# Now "$@" contains all of the arguments except for the first
 

5voto

user148813 Points 135

Merci les gars, faites-le, voici le dernier script 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
 

1voto

jsight Points 16025
#!/bin/bash

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

eval last='$'{$lastidx}
echo $last

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X