Linux
當我按 Enter 鍵時,我的自定義命令提示符中的值不會更新
我正在嘗試製作一個如下所示的自定義命令提示符:
[][][][]$
,其中[]
可以填充自定義資訊。例如,如果我在控制台中編寫. 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
您的腳本目前僅在顯式來源時才更新提示。如果您希望它在每次提示刷新時執行,我認為您需要使用
PROMPT_COMMAND
.嘗試以下修改後的腳本。這將呼叫該函式
set_prompt
以每次更新提示。我還導出了生成文本的命令,以便在收到新提示時再次執行它們以進行更新。使用您的範例命令. file.sh 0 2 "date -R"
,當我按下輸入鍵時,我可以看到日期更新。#!/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