我正在尝试制作一个如下所示的自定义命令提示符:[][][][]$
,其中[]
可以填充自定义信息。例如,如果我在控制台中写入,. file.sh 0 2 "date -R"
则命令提示符看起来像这样,[Sat, 29 Aug 2020 11:02:40 +0200][][][]$
0 代表位置,2 代表值的类型(1 是字符串,2 是本例中的命令,3 是 csv文件)基本上,我希望我的命令提示符是动态的,所以每次我点击输入时,值都应该更新(并非所有值都必须更新,例如字符串始终保持不变,或者 csv 列。)所以例如,当我按 Enter 键时,我希望提示符从 变为[Sat, 29 Aug 2020 11:02:40 +0200][][][]$
。[Sat, 29 Aug 2020 11:02:45 +0200][][][]$
这是我的完整代码:
#!/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 的导出,但没有成功。我还尝试对 PS1 使用单引号,如下所示:export PS1='[$v0][$v1][$v2][$v3]$'
但这也不起作用。我也尝试这样做:export PS1='[$(v0)][$(v1)][$(v2)][$(v3)]$'
但这也不起作用。我不知道该怎么办!
CSV 文件示例:
Date_of_report;Municipality_code;Municipality_name;Province;Total_reported;Hospital_admission;Deceased
2020-03-13 10:00:00;GM0003;Appingedam;Groningen;0;0;0
2020-03-13 10:00:00;GM0010;Delfzijl;Groningen;0;0;0
2020-03-13 10:00:00;GM0014;Groningen;Groningen;3;0;0
2020-03-13 10:00:00;GM0024;Loppersum;Groningen;0;0;0
2020-03-13 10:00:00;GM0034;Almere;Flevoland;1;1;0
2020-03-13 10:00:00;GM0037;Stadskanaal;Groningen;0;0;0
2020-03-13 10:00:00;GM0047;Veendam;Groningen;0;0;0
2020-03-13 10:00:00;GM0050;Zeewolde;Flevoland;1;0;0
2020-03-13 10:00:00;GM0059;Achtkarspelen;Friesland;0;0;0
2020-03-13 10:00:00;GM0060;Ameland;Friesland;0;0;0
2020-03-13 10:00:00;GM0072;Harlingen;Friesland;0;0;0
2020-03-13 10:00:00;GM0074;Heerenveen;Friesland;0;0;0
答案1
您的脚本目前仅在明确提供提示时才会更新提示。如果您希望它在每次提示刷新时运行,我认为您需要使用PROMPT_COMMAND
。
尝试以下修改后的脚本。这将调用函数set_prompt
来每次更新提示。我还导出了生成文本的命令,以便在收到新提示时可以再次运行它们以进行更新。使用您的示例命令. file.sh 0 2 "date -R"
,当我按 Enter 键时,我可以看到日期更新。
#!/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
echo $sum
}
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
export PROMPT0="echo $stringvar"
else
export PROMPT0=""
fi
elif [ $pos -eq 1 ]
then
if [ "$stringvar" != "null" ]
then
export PROMPT1="echo $stringvar"
else
export PROMPT1=""
fi
elif [ $pos -eq 2 ]
then
if [ "$stringvar" != "null" ]
then
export PROMPT2="echo $stringvar"
else
export PROMPT2=""
fi
elif [ $pos -eq 3 ]
then
if [ "$stringvar" != "null" ]
then
export PROMPT3="echo $stringvar"
else
export PROMPT3=""
fi
fi ;;
2) if [ $pos -eq 0 ]
then
export PROMPT0="exec $3"
elif [ $pos -eq 1 ]
then
export PROMPT1="exec $3"
elif [ $pos -eq 2 ]
then
export PROMPT2="exec $3"
elif [ $pos -eq 3 ]
then
export PROMPT3="exec $3"
fi ;;
3) if [ $pos -eq 0 ]
then
export PROMPT0="updatedata $3"
elif [ $pos -eq 1 ]
then
export PROMPT1="updatedata $3"
elif [ $pos -eq 2 ]
then
export PROMPT2="updatedata $3"
elif [ $pos -eq 3 ]
then
export PROMPT3="updatedata $3"
fi ;;
*) echo "Invalid type of variable, try again"
esac
shift
shift
shift
done
function set_prompt() {
v0=$($PROMPT0)
v1=$($PROMPT1)
v2=$($PROMPT2)
v3=$($PROMPT3)
export PS1="[$v0][$v1][$v2][$v3]$"
}
export PROMPT_COMMAND=set_prompt