Enterキーを押してもカスタムコマンドプロンプトの値は更新されません

Enterキーを押してもカスタムコマンドプロンプトの値は更新されません

カスタム情報を入力できる[][][][]$次のカスタムコマンドプロンプトを作成しようとしています。[]たとえば、コンソールに書き込むと、. file.sh 0 2 "date -R"コマンドプロンプトが表示されます。[Sat, 29 Aug 2020 11:02:40 +0200][][][]$0は位置を表し、2は値の種類を表します(1は文字列、この場合2はコマンド、3はcsvファイル)デフォルトでは、コマンドプロンプトを動的にしたいので、Enterキーを押すたびに値を更新する必要があります。 (文字列は常に同じままであるか、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

おすすめ記事