Linux

當我按 Enter 鍵時,我的自定義命令提示符中的值不會更新

  • August 30, 2020

我正在嘗試製作一個如下所示的自定義命令提示符:[][][][]$,其中[]可以填充自定義資訊。例如,如果我在控制台中編寫. 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

引用自:https://unix.stackexchange.com/questions/606918