I'm trying to write a quick bash function that populates a README.md
with a $1\n
followed by underscores the length of $1
.
The code I found in other stackexchange questions showed that to print a character <n>
times, use
printf '=%.0s' {1..<n>}
and indeed, this works (obviously replacing <n>
with a number).
To create my README.md
, I thought the function would look something like this:
make_readme() {
echo "$1
$(printf '=%.0s' {1..${#1}})" > README.md
}
make_readme "Some project"
This, however, produces a file with this text:
Some project
=
As far as I can tell, ${#1}
within the $(...)
is being replaced with the empty string. My guess is that command substitutions get their own argument scopes, and since there are no arguments passed to the substitution, $1
is being replaced with nothing.
I did finally finagle a couple workarounds:
make_readme() {
underline="printf '=%.0s' {1..${#1}}"
echo "$1
$(eval "$underline")" > README.md
}
or
make_readme() {
echo "$1" > README.md
printf '=%.0s' {1..${#1}} >> README.md
}
but it seems like there should be a way to do this in one line.
eval
approach taken in the accepted answer there. The answers here should therefore be more directed to the last part of the question, i.e. how to make it nicer looking.