如何解决按下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][]$
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。