6
votes

Concaténer les entrées dans le script Bash

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


0 commentaires

6 Réponses :


3
votes

Ceci est une solution laid mais simple: xxx


6 commentaires

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



12
votes
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 "$@")"

5 commentaires

Désolé d'être strict, mais -1 pour le style Bad Shell (très verbeux et [[...]] n'est pas portable). Utiliser test à la place, et voir ma solution pour une alternative à l'utilisation de $ {A: 0: 1}


@Joso pourquoi n'est-il pas [[]] portable?


C'est bash, pas Posix Sh. (La même chose avec $ {A: 0: 1} ). 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 alias [...] ).


@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.



1
votes
flag="$1"
shift
the_rest=""
pad=""
for arg in "$@"
do
    the_rest="${the_rest}${pad}${arg}"
    pad="_"
done

2 commentaires

Comment O.P. obtient-il le "_" souhaité entre chaque Arg?


Vous pouvez définir des ifs pour que son premier caractère contienne _ pour influencer le comportement de la concaténation $ * .



2
votes

Voici un morceau de code que je suis réellement fier de (c'est un style très coquillé, je pense) xxx pré>

J'ai interprété votre question afin de supprimer tous em> arguments commençant par - code> p>

Si vous souhaitez simplement supprimer la séquence de début des arguments débutants avec - p>

#!/bin/sh

shift
IFS=_ ; printf %s\\n "$*"


0 commentaires

0
votes
#!/bin/bash
paramCat () {
for s in "$@" 
do
    case $s in 
        -*)
            ;;
        *) 
            echo -n _${s}
            ;; 
    esac
done
}

catted="$(paramCat "$@")"
echo ${catted/_/} 

0 commentaires

3
votes

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 _


0 commentaires