Je voudrais concaténer tous les arguments passés à mon script bash sauf le drapeau.
Ainsi, par exemple, si le script prend des entrées comme suit:
./myBashScript.sh -flag1 exampleSsortingng1 exampleSsortingng2
Je veux que le résultat soit “exampleSsortingng1_exampleSsortingng2”
Je peux le faire pour un nombre prédéfini d’entrées (c.-à-d. 2), mais comment puis-je le faire pour un nombre arbitraire d’entrées?
function concatenate_args { ssortingng="" for a in "$@" # Loop over arguments do if [[ "${a:0:1}" != "-" ]] # Ignore flags (first character is -) then if [[ "$ssortingng" != "" ]] then ssortingng+="_" # Delimeter fi ssortingng+="$a" fi done echo "$ssortingng" } # Usage: args="$(concatenate_args "$@")"
Voici un morceau de code dont je suis vraiment fier (il est très style shell, je pense)
#!/bin/sh firsttime=yes for i in "$@" do test "$firsttime" && set -- && unset firsttime test "${i%%-*}" && set -- "$@" "$i" done IFS=_ ; echo "$*"
J’ai interprété votre question de manière à supprimer tous les arguments commençant par -
Si vous voulez seulement supprimer la séquence de début des arguments beginnnig avec -
:
#!/bin/sh while ! test "${1%%-*}" do shift done IFS=_ ; echo "$*"
Si vous voulez simplement supprimer le premier argument:
#!/bin/sh shift IFS=_ ; printf %s\\n "$*"
C’est une solution moche mais simple:
echo $* | sed -e "s/ /_/g;s/[^_]*_//"
Vous pouvez également utiliser des chaînes formatées pour concaténer des arguments.
# assuming flag is first arg and optional flag=$1 [[ $1 = ${1#-} ]] && unset $flag || shift concat=$(printf '%s_' ${@}) echo ${concat%_} # to remove the trailing _
nJoy!
flag="$1" shift oldIFS="$IFS" IFS="_" the_rest="$*" IFS="$oldIFS"
Dans ce contexte, "$*"
est exactement ce que vous recherchez, semble-t-il. C’est rarement le bon choix, mais ici c’est le bon choix.
Alternativement, simplement en boucle et concaténer:
flag="$1" shift the_rest="" pad="" for arg in "$@" do the_rest="${the_rest}${pad}${arg}" pad="_" done
La variable $pad
garantit que vous ne vous retrouvez pas avec un trait de soulignement parasite au début de $the_rest
.
#!/bin/bash paramCat () { for s in "$@" do case $s in -*) ;; *) echo -n _${s} ;; esac done } catted="$(paramCat "$@")" echo ${catted/_/}