Bash

將參數長度傳遞給 bash 命令替換

  • August 5, 2020

我正在嘗試編寫一個快速 bash 函式,該函式用 a 填充README.mda$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

引用自:https://unix.stackexchange.com/questions/476423