1

I have the following string in bash

str="kallel"

I want to create from str an str2. The str2 contains str duplicated till the length = 20. So the result should be like this:

str2="kallelkallelkallelka"

How to do in in bash?

0

4 Answers 4

8
$ str="kallel"

$ str2=$(printf "$str%.0s" {1..20})
$ echo "$str2"
kallelkallelkallelkallelkallelkallelkallelkallelkallelkallelkallelkallelkallelkallelkallelkallelkallelkallelkallelkallel

$ str2=$(printf "$str%.0s" {1..3})
$ echo "$str2"
kallelkallelkallel

$ n=5
$ str2=$(printf "$str%.0s" $(seq "$n"))
$ echo "$str2"
kallelkallelkallelkallelkallel
Sign up to request clarification or add additional context in comments.

1 Comment

Gotta say I love this use of printf. It took some noodling, but now I see that printf will repeat it's format string for every argument passed to it (if there are more arguments than replaceable % parameters). The %.0s eats up an argument but adds it to the output as 0 length. Even though it's a little obscure, I think it's a better solution than yes | head | xargs | sed | cut that I presented.
4

This should work:

str="kallel"
str2="${str}"
while (( ${#str2} < 20 ))
do
  str2="${str2}${str}"
done
str2="${str2:0:20}"

5 Comments

Line #2 (str2="${str}") is redundant.
@devnull How so? It's assigning the value of one variable (${str}) as the initial value of a second variable (str2) before the loop... It reduces the loop count by one as well as overwriting any previous value str2 might have had, avoiding an explicit str2=""...
str2 is unassigned, so length is zero. Try echo ${#foo}.
@devnull It's probably unassigned, but I don't know that for sure if this is part of a bigger script. Better to be safe.
@twalberg I think change "It's probably unassigned" to "It's probably assigned". The longer I've been a developer, the more I think this way.
3

I am 100% stealing this answer from Bash : Duplicate a string variable n times but I thought it bore repeating (despite being on a 6 year old question):

$ yes "kallel" | head -20  | xargs | sed 's/ //g' | cut -c1-20
kallelkallelkallelka

Comments

2

I'd go for a while loop personally then cut it at the end.

While the length of str2 is less than 20, add str to str2. Then, for good measure, we cut at the end to max 20 characters.

#!/bin/bash
str="kallel"
str2=""
while [ ${#str2} -le 20 ]
do
    str2=$str2$str
done
str2=`echo $str2 | cut -c1-20`

5 Comments

error in this line while [ ${#stringZ} -le 20] line 35: [: missing ]'`
There should be a space after 20 and before ]. Fixed.
blocked. looks like infinite loop.
Counting the length of $stringZ will always return the same number, since the loop only modifies $str2 and not $stringZ...
sorry guys - just put it together without checking. should work now

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.