bash コマンド置換に引数の長さを渡す

bash コマンド置換に引数の長さを渡す

README.md私はaを$1\n下線の長さで埋める高速bash関数を書こうとしています$1

他のstackexchange質問で見つかったコードは、文字の<n>時間を印刷するために次のように使用されています。

printf '=%.0s' {1..<n>}

実際、これはうまくいきます(明らかに<n>数字を代わりに使用します)。

鉱山を作るには、README.md関数は次のようになると思いました。

make_readme() {
    echo "$1
$(printf '=%.0s' {1..${#1}})" > README.md
}

make_readme "Some project"

ただし、これにより、次のテキストを含むファイルが生成されます。

Some project
=

私が知る限り、${#1}inは$(...)空の文字列に置き換えられます。私の意見では、コマンド置換には独自のパラメータ範囲があり、パラメータが置換に渡されないため、$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
}

しかし、これを一行で実行する方法があるはずです。

ベストアンサー1

提案:

#!/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

どちらもREADME.mdインクルードというファイルを生成します。

Hello World!
============

おすすめ記事