J'ai un tableau des "options" d'une commande.
my_array=(option1 option2 option3)
Je veux appeler cette commande dans un script bash, en utilisant les valeurs de array comme options. Alors, command $(some magic here with my_array) "$1"
devient:
command -option1 -option2 -option3 "$1"
Comment puis-je le faire? C'est possible?
-
au début de chaque motmy_array
?Réponses:
Je préférerais une
bash
manière simple:Une des raisons est les espaces. Par exemple si vous avez:
Les
sed
solutions basées le transformeront en-option1 -option2 -with -space -option3
(longueur 5), mais l'bash
expansion ci-dessus le transformera en-option1 -option2 with space -option3
(longueur encore 3). Rarement, mais parfois c'est important, par exemple:la source
somevar=("${my_array[@]/#/-}")
(Notez la parenthèse autour de la valeur.) Ensuite , bien sûr , vous devez garder la manipuler sous forme de tableau lors de son utilisation:echo "${somevar[@]}"
. En ce qui concerne les fonctions, vous êtes trop limité par les possibilités de la langue. Vous pouvez passer un tableau:somefunc "${my_array[@]/#/-}"
, puis à l' intérieur , vous aurez dans$@
:function somefunc() { echo "$@"; }
. Mais same$@
contiendra aussi les autres paramètres, s’il existe, et aucun autre moyen de retourner le tableau modifié que stdout.@
comme indice de tableau? J'ai fait un test avec zsh 5.5.1 et à la seule différence que j'ai remarqué que zsh préfixait seulement chaque élément lorsqu'il était écrit en tant que${my_array[@]/#/-}
, tandis que bash le faisait également pour l'*
indice.Je ne pensais pas que c'était dans un tableau et je pensais séparer les espaces par une chaîne. Cette solution fonctionnera avec cela, mais étant donné qu'il s'agit d'un tableau, utilisez la solution manatwork (
@{my_array[@]/#/-}
).Ce n'est pas si mal avec
sed
et un sous-shell. La simplicité de l'expression rationnelle dépend de ce que vous pouvez garantir concernant les options. Si toutes les options sont un "mot" (a-zA-Z0-9
seulement), un simple début de mot frontière (\<
) suffira:Si vos options ont d'autres caractères (probablement
-
), vous aurez besoin de quelque chose d'un peu plus complexe:^
correspond au début de la ligne,[ \t]
correspond à un espace ou une tabulation,\|
correspond à l'un^
ou l' autre côté ( ou[ \t]
),\(
\)
groupes (pour le\|
) et stocke le résultat,\<
correspond au début d'un mot.\1
commence le remplacement en gardant le premier match des parens (\(\)
), et-
ajoute bien sûr le tiret dont nous avons besoin.Ceux-ci fonctionnent avec gnu sed, s'ils ne fonctionnent pas avec le vôtre, faites le moi savoir.
Et si vous utilisez la même chose plusieurs fois, vous pouvez simplement le calculer une fois et le stocker:
la source
gsed
(j'ai installé en utilisanthomebrew
). Une autre chose: au lieu deecho $my_array
, je devais faireecho ${my_array[@]}
pour obtenir tous les éléments demy_array
:echo $my_array
me donnait seulement le premier élément. Mais merci pour la réponse et l'explication de la regex, spécialement à propos de "limite de mot", c'est extrêmement utile. :)[ $(echo x | sed 's/\</y/') == "yx" ] || exit
.la source