shell 脚本,如何始终在默认位置打印换行符?

shell script,how to print the newline in default position always?

我正在使用 tput sc/rc/edprintf '\E[n<A|B|C|D>'|printf '\E[y;xH',这里有两个例子:

tty_esc(){ printf "\e[%s" ""; }
tty_cursor_locate(){ tty_esc ";H"; }
tty_cursor_right(){ tty_esc C; }
print_center()
{
    local _width=$(tput cols)
    local _str=
    local _row=
    local _cols=$((((${_width} - ${#_str})) / 2))

    tty_cursor_locate ${_cols:-100} ${_row:-1}
    printf "%s\n" " ${_str} "
}
show_net_adapter()
{
    local _addr _iface _count
    local _origin=
    iface_line_count=

    tty_cursor_locate ${_origin:-0} 4
    printf "%s\n" "Current connected adapter(s):"
    for _iface in $(get_net_adapter);do
        if [[ "${_iface}" != "lo" ]];then
            _addr=$(get_net_addr ${_iface})
            test -z "${_addr}" && continue
            let _count+=1
            let iface_line_count+=1
            if [[ ${_count} != 1 ]];then
                unset _count
                printf '%s' "${tty_rever}"
            fi
            tty_cursor_right ${_origin:-0}
            print_fill 50 ${_iface} ${_addr:--}
            printf "${tty_reset}"
        fi
    done
    print_line -s "=" ${line_origin}
}

如上,我应该在打印之前定位光标。

顺便说一句

我用trap "myfunc" WINCH,只能用一次。当我再次尝试更改我的 crt 时。尺寸,它不起作用。

不太确定你说的 in default position always 是什么意思,要么是故意的,要么是覆盖文本,但下面的函数可以做到这两者。

#!/bin/sh

preent () { # =indent start line, =spaces, =reset cursor, =update (1=itself, 2=delete previous lines, 0=newline), =save cursor, =text
    if text="""""""""" awk -v col="$COLUMNS" -v cp="$_CURSOR_POS" -v id="" -v spc="" -v rc="" -v u="" -v sc="" '
    BEGIN { t=ENVIRON["text"]; lt=sprintf("%d",col/4); idx=1; len=length(t); y=0; sp=sprintf("% " spc "s",""); delete A;
        for(ln=1;idx<len;ln++) { if(ln==id) { col=col-spc; y=1 } bd=col-lt; f=0
            for(i=idx+col-1;i>bd;i--) { c=substr(t,i,1);
                if(c==" ") {
                    if(y) { A[ln]=sprintf("%s%s",sp,substr(t,idx,i-idx)); idx=i+1; f=1; break
                    } else { A[ln]=substr(t,idx,i-idx); idx=i+1; f=1; break }
                } else if(c=="") {
                    if(y) { A[ln]=sprintf("%s%s",sp,substr(t,idx,i-idx)); idx=i; f=1; break
                    } else { A[ln]=substr(t,idx,i-idx); idx=i; f=1; break; }
                }
            }
            if(!f) {
                if(y) { A[ln]=sprintf("%s%s",sp,substr(t,idx,col)); idx=idx+col
                } else { A[ln]=substr(t,idx,col); idx=idx+col }
            }
        } if(rc=="true") cp=0;
        if(u=="1") { for(i=1;i<ln;i++) printf("\x1B[1A\x1B[K"); cp=cp+1-i
        } else if(u=="2") { for(i=0;i<cp;i++) printf("\x1B[1A\x1B[K"); cp=0 }
        for(i=1;i<ln;i++) printf("%s\n",A[i]);
        if(sc=="true") { exit ln-1+cp } else { exit 0 }
    }'; then _CURSOR_POS="$?"; else _CURSOR_POS="$?"; fi
}

示例1(长文本,5个空格缩进,从第2行开始缩进)

preent 2 5 'false' 0 'false' 'You never say good-bye Handong-an monghani udukoni anja Dashi saenggakhatjiman ' \
'Momchul sun optkesso Ontong kudae saenggak hal subakke omnun ' \
"Nae jashini miwo Don't you let me go Baby don't you let me down"

输出

You never say good-bye Handong-an monghani
     udukoni anja Dashi saenggakhatjiman Momchul
     sun optkesso Ontong kudae saenggak hal
     subakke omnun Nae jashini miwo Don't you
     let me go Baby don't you let me down

示例 2(没有空格的长文本)

preent 2 5 'false' 0 'false' 'Youneversaygood-byeHandong-anmonghaniudukonianjaDashisaenggakhatjiman' \
'MomchulsunoptkessoOntongkudaesaenggakhalsubakkeomnun' \
"NaejashinimiwoDon'tyouletmegoBabydon'tyouletmedown"

输出

Youneversaygood-byeHandong-anmonghaniudukonianjaD
     ashisaenggakhatjimanMomchulsunoptkessoOntong
     kudaesaenggakhalsubakkeomnunNaejashinimiwoDo
     n'tyouletmegoBabydon'tyouletmedown