我有這個功能:
#! /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 中無法做到這一點(似乎)。
uj5u.com熱心網友回復:
不,您不能將它們組合在 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/473105.html
