web-dev-qa-db-fra.com

Création d'une chaîne de caractères répétés dans le script Shell

J'ai besoin de générer une chaîne de points (.characters) en tant que variable.

C'est-à-dire, dans mon script Bash, pour l'entrée 15 J'ai besoin de générer cette chaîne de longueur 15: ...............

Je dois le faire de manière variable. J'ai essayé de l'utiliser comme base ( d'Unix.com ):

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

Mais comment faire en sorte que le 100 soit une variable?

38
RubiCon10

Vous pouvez obtenir autant d'octets NULL que vous le souhaitez à partir de/dev/zero. Vous pouvez ensuite les transformer en d'autres personnages. Les impressions suivantes 16 minuscules a

head -c 16 < /dev/zero | tr '\0' '\141'
66
Electron
len=100 ch='#'
printf '%*s' "$len" | tr ' ' "$ch"
33
Chris Johnsen

Moyen le plus simple et le plus court sans boucle

VAR=15

Imprime autant de points que VAR le dit (changez le premier point en n'importe quel autre caractère si vous le souhaitez):

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

Enregistre la ligne pointillée dans une variable pour une utilisation ultérieure:

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

-Volument volé dans la réponse de Dogbane https://stackoverflow.com/a/5349842/3319298

Edit : Puisque je suis maintenant passé à fish Shell, voici un fonction définie dans config.fish qui le fait avec commodité dans ce Shell:

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

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

19
Epigene

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

N=100
myvar=`Perl -e "print '.' x $N;"`
6

J'ai dé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 addendum à la fin sur la production d'un nombre variable de caractères répétés, ce que vous avez demandé, donc ma réponse précédente est pertinente ici:

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

J'ai fourni une explication complète de la façon dont cela fonctionne là-bas. Ici, je vais simplement ajouter le code pour accomplir ce que 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

Les sorties:

....................
5
CaffeineConnoisseur

Vous pouvez utiliser des boucles for de style C 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 d'externes tels que sed ou tr:

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

La solution sans boucles:

N=100
myvar=`seq 1 $N | sed 's/.*/./' | tr -d '\n'`
3
num=100
myvar=$(jot -b . -s '' $num)
echo $myvar
3
Alexander Gladysh