J'aimerais concaténer tous les arguments passés à mon script Bash, à l'exception du drapeau.
Donc, par exemple, si le script prend des entrées comme suit: P>
./myBashScript.sh -flag1 exampleString1 exampleString2
6 Réponses :
Ceci est une solution laid mais simple:
et mal. Avez-vous lu la question?
@Joso: Oui, et cela tombe dans sa spécification (mal formulée).
Cependant, vous interprétez la spécification, votre solution est fausse. Cela n'enlève même aucun argument.
oh je vois maintenant, tu as raison, corrigé
C'est mieux maintenant, mais cela ne peut toujours pas être complètement correct selon toute interprétation. Considérer les espaces dans le premier argument.
Oui, c'est là que "laid mais simple" vient dans
function concatenate_args { string="" for a in "$@" # Loop over arguments do if [[ "${a:0:1}" != "-" ]] # Ignore flags (first character is -) then if [[ "$string" != "" ]] then string+="_" # Delimeter fi string+="$a" fi done echo "$string" } # Usage: args="$(concatenate_args "$@")"
Désolé d'être strict, mais -1 pour le style Bad Shell (très verbeux et [[...]] code> n'est pas portable). Utiliser
test code> à la place, et voir ma solution pour une alternative à l'utilisation de
$ {A: 0: 1} code>
@Joso pourquoi n'est-il pas [[]] code> portable?
C'est bash, pas Posix Sh. (La même chose avec $ {A: 0: 1} code>). Bien qu'il y ait certains qui ne se soucient pas parce que Bash est installé sur presque n'importe quel système, il n'a pas vraiment d'utilisation (utilisation
test code> alias
[...] code> ).
@Joso Il dit clairement qu'il utilise Bash.
Je n'ai pas dit que cela ne fonctionne pas, c'est juste une question de style (et de portabilité). Nous devrions donner des exemples de bonnes pratiques de codage et la vôtre n'est pas une.
flag="$1" shift the_rest="" pad="" for arg in "$@" do the_rest="${the_rest}${pad}${arg}" pad="_" done
Comment O.P. obtient-il le "_" souhaité entre chaque Arg?
Vous pouvez définir des ifs pour que son premier caractère contienne _ code> pour influencer le comportement de la concaténation
$ * code>.
Voici un morceau de code que je suis réellement fier de (c'est un style très coquillé, je pense) J'ai interprété votre question afin de supprimer tous em> arguments commençant par Si vous souhaitez simplement supprimer la séquence de début des arguments débutants avec - code> p>
- p>
#!/bin/sh
shift
IFS=_ ; printf %s\\n "$*"
#!/bin/bash paramCat () { for s in "$@" do case $s in -*) ;; *) echo -n _${s} ;; esac done } catted="$(paramCat "$@")" echo ${catted/_/}
Vous pouvez également utiliser des chaînes formatées pour concaténer des args.
# assuming flag is first arg and optional flag=$1 [[ $1 = ${1#-} ]] && unset $flag || shift concat=$(printf '%s_' ${@}) echo ${concat%_} # to remove the trailing _