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 _