Bash
將參數長度傳遞給 bash 命令替換
我正在嘗試編寫一個快速 bash 函式,該函式用 a 填充
README.md
a$1\n
後跟下劃線的長度$1
。我在其他 stackexchange 問題中找到的程式碼顯示要列印字元
<n>
時間,請使用printf '=%.0s' {1..<n>}
確實,這行得通(顯然用
<n>
數字代替)。要創建 my
README.md
,我認為該函式看起來像這樣:make_readme() { echo "$1 $(printf '=%.0s' {1..${#1}})" > README.md } make_readme "Some project"
但是,這會生成一個包含以下文本的文件:
Some project =
據我所知,
${#1}
其中$(...)
的被替換為空字元串。我的猜測是命令替換有自己的參數範圍,並且由於沒有傳遞給替換的參數,$1
因此被替換為空。我終於找到了幾個解決方法:
make_readme() { underline="printf '=%.0s' {1..${#1}}" echo "$1 $(eval "$underline")" > README.md }
或者
make_readme() { echo "$1" > README.md printf '=%.0s' {1..${#1}} >> README.md }
但似乎應該有一種方法可以在一行中做到這一點。
建議:
#!/bin/bash make_readme () { printf '%s\n%s\n' "$1" "$( eval "printf '=%.0s' {1..${#1}}" )" } make_readme 'Hello World!' >README.md
或者,如果可以呼叫外部實用程序,
#!/bin/bash make_readme () { # print $1, then replace all characters in it with = and print again sed 'p; s/./=/g' <<<"$1" } make_readme 'Hello World!' >README.md
這兩個都會生成一個名為contains 的
README.md
文件Hello World! ============
我建議:
make_readme () { printf '%s\n%s\n' "$1" "${1//?/=}" } make_readme 'Hello World!' >README.md