如何在bash变量中避免换行和制表符?

3

我希望创建一个多行变量,它将被分成几行,并在每个新行上进行缩进(不显示缩进)。我已经尝试过几种方法:

function regprompt {
    case "$TERM" in
        xterm*)
            PS1=$(cat <<-EOF
                    ${blue} \u ${txtrst}on ${cyan}\h${white}\$gitps1 ${blue}\${fill} \
                    ${undgrn}\d \D{%r} ${blue}\
                    \n[ ${yellow}\$newPWD ${blue}] ${txtrst}$ ${blue}
EOF
)
        ;;
        linux*)
            PS1="${green} \u ${txtrst}on ${cyan}\h${white}\$gitps1 ${green}\${fill} \
                 ${undgrn}\d \D{%r} ${green}\
                 \n[ ${yellow}\$newPWD ${green}] ${txtrst}$ ${green}"
        ;;
        screen*)
            PS1="${green} \u ${txtrst}on ${cyan}\h${white}\$gitps1 ${green}\${fill} \
${undgrn}\d \D{%r} ${green}\
                 \n[ ${yellow}\$newPWD ${green}] ${txtrst}$ ${green}"
        ;;
    esac
}

第一个选项显示了日期部分(\d \D{%r})缩进,我只想显示一个空格(在转义符之前的那个)。其他所有内容都正确显示。第二个选项也是如此。屏幕选项将正确显示,我只想知道是否有一种方法可以保持它的组织性?

1个回答

3

如果您的变量不需要包含制表符,则可以使用单引号(允许换行符),使用制表符进行缩进,然后使用 tr 命令移除制表符。例如:

var='ab
        cd
                        ef
gh
        ij'
var=$(echo "$var" | tr -d '\t')
echo "$var"

请注意,此处的缩进必须是制表符,而不是空格才能生效。不幸的是,我不知道如何在格式中指示这一点。这个技巧可以在脚本中使用,但在交互式 shell 中输入制表符可能不可行,因为制表符被 readline 用于制表完成。如果您的变量中不需要出现前导空格,则可以使用空格,并且可以使用类似于 sed -e 's/^ \+//' 的东西来替代 tr -d '\t'

工作得非常好!谢谢,尝试解决这个问题真是一场痛苦,应该先在这里询问;看来现在是学习sed、tr之类的时候了 :|。 - bluTaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接