按下Enter键后,我的自定义提示不会更新吗?

问题描述

我正在尝试自定义提示。当我点击输入时,提示中的某些值应该被更新,但是没有更新。 我尝试添加导出,就像这样

export PS1="[$v0][$v1][$v2][$v3]$"

但是没有更新。例如,在控制台中,我写0 2“ date -R”, 输出将是这样的

[Fri,28 Aug 2020 16:54:00 +0200][][][]$

当我按Enter时,它保持不变,但我希望对其进行更新。 我尝试在PS1上也使用单引号而不是双引号,但是没有用。

此处显示完整代码

#!/bin/bash

updatedata() {



v=$(awk -v strSearch="$1" '
BEGIN{
    FS=";"
}
{
    gsub(/\r/,"")
    for(i=1;i<=NF;i++){
        if($i==strSearch){ print i
            exit
        }
    }
}
' data.csv)

sum=0
for x in `cut -f $v -d ';' data.csv`
do
    x="${x/$'\r'/}"
    let sum=$sum+$x
done

if [ $pos -eq 0 ]
then
    v0=$sum
elif [ $pos -eq 1 ]
then
    v1=$sum
elif [ $pos -eq 2 ]
then
    v2=$sum
elif [ $pos -eq 3 ]
then
    v3=$sum
fi




         
}
           

       
while [ "$#" -gt 0 ]; do
    pos=$1
    typevar=$2
    stringvar=$3
    case $pos in
      0) v0=$3 ;;
      1) v1=$3 ;;
      2) v2=$3 ;;
      3) v3=$3 ;;
      *) echo "One of the values has invalid position entered,try again"
     
    esac
    case $typevar in
      1) if [  $pos -eq 0 ]
        then
            if [ "$stringvar" != "null" ]
            then
                v0=$stringvar
            else
                v0=""
            fi
        elif [ $pos -eq 1 ]
        then
            if [ "$stringvar" != "null" ]
            then
                v1=$stringvar
            else
                v1=""
            fi
        elif [ $pos -eq 2 ]
        then
            if [ "$stringvar" != "null" ]
            then
                v2=$stringvar
            else
                v2=""
            fi
        elif [ $pos -eq 3 ]
        then
            if [ "$stringvar" != "null" ]
            then
                v3=$stringvar
            else
                v3=""
            fi
        fi ;;
           
       
      2) if [ $pos -eq 0 ]
        then
            v0=`eval $3`
        elif [ $pos -eq 1 ]
        then
            v1=`eval $3`
        elif [ $pos -eq 2 ]
        then
            v2=`eval $3`
        elif [ $pos -eq 3 ]
        then
            v3=`eval $3`
        fi ;;
      3) updatedata $3 ;;
      *) echo "Invalid type of variable,try again"
     
     
     
    esac
    shift
    shift
    shift
   
done

export PS1="[$v0][$v1][$v2][$v3]$"

解决方法

您需要将提示置于单引号而不是双引号中。分配给PS1时,将评估双引号内的变量,而不是打印提示时。

export PS1='[$v0][$v1][$v2][$v3]$'

您也可以将命令替换直接放入提示中,不需要变量。

export PS1='[$(date -R)][$v1][$v2][$v3]$'
,

使用eval可能是一个糟糕的主意,您可以在没有它的情况下做到这一点,但这是一个让您入门的主意:

$ PS1='[$v0][$v1][$v2][$v3]\$ '
[][][][]$ v2=test
[][][test][]$ setps() { eval v$1="'$2'"; }
[][][test][]$ setps 2 "$(date)"
[][][Fri Aug 28 15:44:21 GMT 2020][]$