Paramètres de l'extrait de l'avant-dernier paramètre “$@”
Je suis en train de créer un script Bash qui va extraire le dernier paramètre donné à partir de la ligne de commande dans une variable pour l'utiliser ailleurs. Voici le script que je suis en train de travailler sur:
#!/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
Depuis la première paramètres pourrait être de n'importe quel nombre, je dois trouver un moyen d'extraire le dernier paramètre (par ex. fichier compact.un fichier.b fichier.d files-a-b-d.tar.gz). Comme c'est maintenant le nom de l'archive seront incluses dans les fichiers à compresser. Est-il un moyen de faire cela?
Vous devez vous connecter pour publier un commentaire.
Pour supprimer le dernier élément du tableau vous pouvez utiliser quelque chose comme ceci:
Encore plus court chemin:
Mais arays sont un Bashism, essayez d'éviter de les utiliser :(.
echo "${@:1:$(($#-1))}"
C'est quelques jolies noyau dur de script.echo "files = ${@:1:-1}, name = ${@: -1}"
array=${@:1:$#-1}
!#
à l'équivalent de$#
en raison de: "Si le premier caractère du paramètre est un point d'exclamation (!), et le paramètre n'est pas un nameref, il introduit un niveau de variable d'indirection." gnu.org/software/bash/manual/html_node/...Portable et compact solutions
C'est comment je le fais dans mes scripts
MODIFIER
Selon certains commentaires (voir ci-dessous), cette solution est plus mobiles que d'autres.
Veuillez lire Michael Dimmitt de commentaire pour une explication de la façon dont il fonctionne.
Example: ( item1 item2 item2 ) => ( item1 )
Plusieurs solutions ont déjà été publiés; cependant, je vous conseille la restructuration de votre script, de sorte que le nom de l'archive est la première paramètre, plutôt que la dernière. Alors c'est très simple, puisque vous pouvez utiliser le
maj
builtin pour supprimer le premier paramètre:Merci les gars, suis fait, voici le dernier script bash:
FILES=("${@:1:$length}")
, puistar ... "${FILES[@]}"; else
doit travailler beaucoup plus fiableJuste de laisser tomber les
length
variable utilisée dans Krzysztof Klimonda la solution:(-$#)
pour?Je voudrais ajouter un commentaire, mais vous n'avez pas assez de réputation et la réponse a un peu plus de temps de toute façon. Espérons qu'il n'a pas l'esprit.
Comme @func a déclaré:
Comment cela fonctionne:
${!PARAM} indique le niveau d'indirection. Vous n'êtes pas le référencement PARAM lui-même, mais la valeur stockée dans PARAM ( pensez à PARAM comme pointeur sur la valeur ).
${#} se développe en un certain nombre de paramètres (Note: $0 - le nom du script, n'est pas prise en compte ici).
Envisager la suite de l'exécution:
Et dans le myscript.sh
Par conséquent, vous pouvez penser à ${!#} comme un raccourci pour le au-dessus de l'utilisation de eval, qui fait exactement l'approche décrite ci - dessus évalue la valeur stockée dans le paramètre donné, ici le paramètre est 3 et détient la position argument $3
Maintenant, si vous voulez que tous les paramètres à l'exception de la dernière, vous pouvez utiliser la sous-chaîne de suppression de ${PARAM%MODÈLE} où % signe signifie 'enlever le plus court qui correspondent au motif de la fin de la chaîne".
Donc dans notre script:
Vous pouvez lire quelque chose ici: Paramètre d'extension
Êtes-vous sûr que cette fantaisie script est mieux qu'un simple alias de goudron?
D'Usage:
Où les FICHIERS peuvent être
file1 file2
ou globs comme*.html
Essayer:
Tableau sans le dernier paramètre:
Mais c'est un bashism :(. Des solutions consisterait maj et ajout de variable comme d'autres de l'utiliser.
Autre façon de tirer le dernier paramètre de la liste d'arguments:
Je ne peux pas trouver un moyen d'utiliser la matrice de notation indice sur
$@
, donc c'est le mieux que je puisse faire:Ce script peut travailler pour vous - il renvoie un sous-groupe des arguments, et peut être appelé à partir d'un autre script.
Exemples:
args_get_range.sh