如何在bash变量中转义换行符和制表符?

时间:2012-03-09 11:40:04

标签: bash tabs escaping variable-assignment heredoc

我想创建一个multilne变量,它将被拆分为多行,在每个新行上缩进(不显示缩进)。我尝试了几种方法:

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 个答案:

答案 0 :(得分:3)

如果您的变量不需要包含选项卡,则可以使用单引号(允许换行),缩进选项卡,然后使用tr删除选项卡。例如:

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

请注意,缩进必须是制表符,而不是用于此操作的空格。不幸的是我不知道如何在格式化中表明这一点。此技巧将在脚本中起作用,但在交互式shell中,可能无法输入选项卡,因为readline用于制表符完成选项卡。如果您的变量中不需要前导空格,您也可以使用空格,而不是tr -d '\t'使用sed -e 's/^ \+//'之类的内容。