concaténer les entrées en script bash

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/_/}