2010-07-09 2 views
25

Je dois générer une chaîne de points (. caractères) en tant que variable.Création d'une chaîne de caractères répétés dans le script shell

à savoir, dans mon script Bash, pour l'entrée 15 je besoin de générer cette chaîne de longueur 15: ...............

je besoin de le faire variablement. J'ai essayé d'utiliser cela comme une base (from Unix.com):

for i in {1..100};do printf "%s" "#";done;printf "\n" 

Mais comment puis-je obtenir le 100 comme une variable?

+0

connexes sur [SU]: http://superuser.com/q/86340/ 269404 – Palec

+0

Duplicata: http://stackoverflow.com/q/5349718/2157640 http://stackoverflow.com/q/5799303/2157640 – Palec

+0

Dans 'zsh' au moins,' {1 .. $ length} 'fonctionne très bien . –

Répondre

5

Sur la plupart des systèmes, vous pouvez sortir avec un simple

N=100 
myvar=`perl -e "print '.' x $N;"` 
2

La solution sans boucles:

N=100 
myvar=`seq 1 $N | sed 's/.*/./' | tr -d '\n'` 
21
len=100 ch='#' 
printf '%*s' "$len" | tr ' ' "$ch" 
+1

C'est la solution la plus courte [POSIX 7] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html#tag_20_94) que j'ai vu jusqu'ici. –

+1

peut être encore plus court, sortez la citation dans "$ len" pour être $ len;) –

-1

Quand je dois créer une chaîne qui contient $x répétitions d'un caractère connu avec $x en dessous d'une valeur constante, j'utilise cet idiome:

base='....................' 
# 0 <= $x <= ${#base} 
x=5 
expr "x$base" : "x\(.\{$x\}\)" # Will output '\n' too 

Sortie:

..... 
+2

Dans bash et ksh (peut-être zsh), vous pouvez écrire 'echo $ {base: 0: $ x}' - détails [ ici] (http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion) –

3

Vous pouvez utiliser C style for boucles dans Bash:

num=100 
string=$(for ((i=1; i<=$num; i++));do printf "%s" "#";done;printf "\n") 

ou sans boucle, en utilisant printf sans utiliser de externals tels que sed ou tr:

num=100 
printf -v string "%*s" $num ' ' '' $'\n' 
string=${string// /#} 
46

Vous pouvez obtenir autant de NU LL octets comme vous voulez de/dev/zero. Vous pouvez ensuite les transformer en d'autres caractères. Les impressions suivantes 16 minuscules un de

head -c 16 < /dev/zero | tr '\0' '\141' 
+5

+1 pour une solution douce et portable sans des bashismes sales ou des centaines de processus engendrés – fstd

+2

vous pouvez utiliser/dev/zero directement, pas besoin de rediriger – edoceo

+3

Not * that * sweet et portable: "head: option illégale - c" (SunOS 5.10 Generic_150401-20 i86pc i386 i86pc) – dokaspar

2
num=100 
myvar=$(jot -b . -s '' $num) 
echo $myvar 
12

Easiest et chemin le plus court sans boucle

VAR=15 

Imprime autant de points que VAR dit (changer le premier point à un autre caractère si vous comme):

printf '.%.0s' {1..$VAR} 

Enregistre la ligne pointillée dans une variable à utiliser lat er:

line=`printf '.%.0s' {1..$VAR}` 
echo "Sign here $line" 

-Blatantly volé de la réponse de dogbane https://stackoverflow.com/a/5349842/3319298

Edit: Depuis que je suis maintenant passé à shell poisson, voici une fonction définie dans la configuration.poissons qui le fait avec facilité dans cette coquille:

function line -a char -a length 
    printf '%*s\n' $length "" | tr ' ' $char 
end 

Utilisation: line = 8 produit ========, line \" 8 produit """""""".

+1

quelle manière intéressante d'exploiter la fonction de shell de printf qui consomme de manière répétée des arguments jusqu'à ce qu'elle soit satisfaite en combinaison avec une largeur de champ nul, forçant juste la chaîne avant que le% soit imprimé. Cela pourrait être utilisé comme une astuce pour diviser le compte aussi (en ajoutant deux fois le% .0s pour le forcer à consommer 2 arguments par passe) – osirisgothra

+0

oh ouais et j'ai oublié quelque chose d'important, puisque printf traite% s avec un zéro si aucun argument sont donnés, une valeur de zéro serait un problème, pour cela vous devrez ajouter une instruction if – osirisgothra

+1

Cela ne fonctionne que pour moi dans mon shell (bash) si j'utilise eval: 'VAR = 15; eval printf '=%. 0s' {1 .. $ VAR} ' – 6EQUJ5

4

J'ai montré un moyen d'accomplir cette tâche avec une seule commande dans une autre question, en supposant que c'est un nombre fixe de caractères à produire.

j'ai ajouté un additif à la fin de produire un nombre variable de caractères répétés, qui est ce que vous avez demandé, donc ma précédente réponse est pertinente:

https://stackoverflow.com/a/17030976/2284005

Je fourni une explication complète comment ça marche là-bas. Ici, je vais juste ajouter le code pour accomplir ce que vous vous demandez:

n=20 # This the number of characters you want to produce 

    variable=$(printf "%0.s." $(seq 1 $n)) # Fill $variable with $n periods 

    echo $variable # Output content of $variable to terminal 

Sorties:

....................