У меня есть эта функция:
#! /usr/bin/env bash
function underline() {
U = "${1//?/${2:--}}"
echo -e "\n$1\n${U:0:${#1}}\n"
}
underline "$1" "^-v-"
будет работать как положено:
$ ./u.sh "This is all you're going to see"
This is all you're going to see
^-v-^-v-^-v-^-v-^-v-^-v-^-v-^-v
Он делает то, что вы ожидаете. Первоначально предполагалось, что символ подчеркивания был всего лишь 1 символом.
Для «забавы» я расширил его, чтобы перейти от подчеркивания одного символа к подчеркиванию повторяющейся строки (почему? ... ну ... потому что я могу предположить ... почти нулевая практическая ценность в этом упражнении!).
Итак, будучи парнем типа «давайте сделаем это настолько сложным, что вам нужно написать 2 страницы документации, чтобы объяснить, что происходит», мне было интересно, можно ли написать функцию в виде одной строки. И я не имею в виду:
function underline() { U = "${1//?/${2:--}}"; echo -e "\n$1\n${U:0:${#1}}\n"; }
Я не думаю, что вы можете комбинировать поиск/замену переменной bash с подстрокой, что и требуется.
Я знаю, что это будет успешно работать в zsh:
#! /usr/bin/env zsh
function underline() {
echo -e "\n$1\n${${1//?/${2:--}}:0:${#1}}\n"
}
underline $1 "^-v-"
например
$ ./u.sh "This is all you're going to see"
This is all you're going to see
^-v-^-v-^-v-^-v-^-v-^-v-^-v-^-v
но не способен на это в bash (кажется).





Нет, вы не можете комбинировать их в одном расширении параметра в bash. Но этот единственный printf (встроенный в bash) должен помочь:
underline() { printf '%s\n%.*s\n' "$1" ${#1} "${1//?/${2:--}}"; }
underline "This is all you're going to see" "^-v-"
выходы
This is all you're going to see
^-v-^-v-^-v-^-v-^-v-^-v-^-v-^-v
Ницца! И я узнал немного больше о
printfсегодня! Благодарю вас!