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?
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'
len=100 ch='#'
printf '%*s' "$len" | tr ' ' "$ch"
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 """"""""
.
Sur la plupart des systèmes, vous pouvez vous en tirer avec un simple
N=100
myvar=`Perl -e "print '.' x $N;"`
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:
....................
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'`
num=100
myvar=$(jot -b . -s '' $num)
echo $myvar